如何检查where子句中的COndition

问题描述 投票:0回答:1
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
sql-server sql-server-2008 case where-clause
1个回答
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;
© www.soinside.com 2019 - 2024. All rights reserved.