Sql server 如何检查where子句中的条件
它在case条件附近抛出错误在case条件附近抛出错误语法 我需要如何检查上述条件?我只需要在Sql server 如何检查where子句中的条件,sql-server,sql-server-2008,case,where-clause,Sql Server,Sql Server 2008,Case,Where Clause,它在case条件附近抛出错误在case条件附近抛出错误语法 我需要如何检查上述条件?我只需要在 SELCT * FROM @Locations Loc INNER JOIN SubProposal SP ON SP.MasterProposalId = Loc.ProposalId WHERE SP.EndEffectiveDate = @EndEffectiveDate AND ISNULL(SP.Data.value('(/*/IsRemovedByEndorseme
SELCT * FROM @Locations Loc
INNER JOIN SubProposal SP ON SP.MasterProposalId = Loc.ProposalId
WHERE SP.EndEffectiveDate = @EndEffectiveDate
AND ISNULL(SP.Data.value('(/*/IsRemovedByEndorsement)[1]', 'bit'), 0) = 0
CASE WHEN (@AS22_RightOfPledgeNum <> '') THEN
AND (SP.Data.value('(/*/Answers/AnswersList/Entry[@key="as22_RightOfPledgeNum"]/value)[1]', 'nvarchar(max)')= @AS22_RightOfPledgeNum) ELSE 1
END
对不起。下面的第一个答案并不完全正确。在我发布帖子后,我马上意识到我误解了这个问题。您需要基于变量的不同WHERE子句。因此,您需要在查询之外使用IF语句,因为SQL无法理解您试图使用它的方式。 我不知道你在这里想干什么。WHERE语句需要有一个条件进行测试。如果我理解你的意思
CASE WHEN (@AS22_RightOfPledgeNum <> '') THEN
AND (SP.Data.value('(/*/Answers/AnswersList/Entry[@key="as22_RightOfPledgeNum"]/value)[1]', 'nvarchar(max)')= @AS22_RightOfPledgeNum) ELSE 1
END
旧的答案不完全是关于钱的:
您正在尝试根据行中的数据应用不同的WHERE子句。WHERE子句应用于完整的数据集。您需要将数据分为两个集合,并分别对每个集合应用正确的WHERE子句
将您的案例条件添加到联接条件中,以将数据拉取限制到您感兴趣的行,然后将您想要的WHERE条件应用到每个集合
大概是这样的:
IF @AS22_RightOfPledgeNum <> ''
BEGIN
SELECT * FROM @Locations Loc
INNER JOIN SubProposal SP
ON SP.MasterProposalId = Loc.ProposalId
WHERE SP.EndEffectiveDate = @EndEffectiveDate
AND ISNULL(SP.Data.value('(/*/IsRemovedByEndorsement)[1]', 'bit'), 0) = 0
AND (SP.Data.value('(/*/Answers/AnswersList/Entry[@key="as22_RightOfPledgeNum"]/value)[1]', 'nvarchar(max)')= @AS22_RightOfPledgeNum)
ELSE
SELECT * FROM @Locations Loc
INNER JOIN SubProposal SP
ON SP.MasterProposalId = Loc.ProposalId
WHERE SP.EndEffectiveDate = @EndEffectiveDate
AND ISNULL(SP.Data.value('(/*/IsRemovedByEndorsement)[1]', 'bit'), 0) = 0;
你真的需要案例来实现你想要的吗?语法看起来也不正确-CASE可能是表达式的一部分,但在您的情况下不是。您通常会这样做:WHERE something=CASE WHEN…如果不是CASE,我可以在那里使用什么来检查任何代码段的条件。?提示:动态SQL
SELCT * FROM @Locations Loc
INNER JOIN SubProposal SP
ON SP.MasterProposalId = Loc.ProposalId
AND @AS22_RightOfPledgeNum <> ''
WHERE SP.EndEffectiveDate = @EndEffectiveDate
AND ISNULL(SP.Data.value('(/*/IsRemovedByEndorsement)[1]', 'bit'), 0) = 0
AND (SP.Data.value('(/*/Answers/AnswersList/Entry[@key="as22_RightOfPledgeNum"]/value)[1]', 'nvarchar(max)')= @AS22_RightOfPledgeNum)
UNION ALL
SELCT * FROM @Locations Loc
INNER JOIN SubProposal SP
ON SP.MasterProposalId = Loc.ProposalId
AND @AS22_RightOfPledgeNum = ''
WHERE SP.EndEffectiveDate = @EndEffectiveDate
AND ISNULL(SP.Data.value('(/*/IsRemovedByEndorsement)[1]', 'bit'), 0) = 0;