如何检查where子句中的COndition
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何检查where子句中的COndition相关的知识,希望对你有一定的参考价值。
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
它会在案例条件附近抛出错误“CASE附近的语法不正确
我如何检查上述条件我只需要包含此语句
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无法以您尝试使用它的方式理解CASE。我不确定我明白你在这里要做什么。你的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;
旧答案(不完全是钱):您正在尝试根据连续数据应用不同的WHERE子句。但是,WHERE子句应用于完整数据集。您需要将数据分成两组,并分别将正确的WHERE子句应用于每个集合。
将CASE条件添加到JOIN条件,以限制数据拉动到您感兴趣的行,然后将所需的WHERE条件应用于每个集合。
像这样的东西:
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;
以上是关于如何检查where子句中的COndition的主要内容,如果未能解决你的问题,请参考以下文章
sql面试题_SQl优化技巧_1注意通配符中like的使用,百分号放后面_2避免在where子句中对字段进行函数操作_3在子查询当中,尽量用exists代替in_4where子句中尽量不要使用(代码片
有没有人有一个用于创建 SQL Where 子句的用户界面示例?