【问题标题】:how to check COndition in where clause如何检查where子句中的条件
【发布时间】:2018-03-05 11:56:42
【问题描述】:
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 附近的语法不正确”附近抛出错误

我需要如何检查上面的条件我需要包含这个语句只有当

 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 应该是表达式的一部分,但在你的情况下它不是。你通常会这样做:WHERE something = CASE WHEN....
  • 如果不是 case 我可以用什么来检查任何代码 sn-p 的条件?
  • 提示:动态 SQL

标签: sql-server sql-server-2008 case where-clause


【解决方案1】:

对不起。下面的第一个答案并不完全正确。我在发布后立即意识到我误读了查询。您需要基于变量的不同 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-25
    • 2020-05-31
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 2018-01-01
    相关资源
    最近更新 更多