Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何检查where子句中的条件_Sql Server_Sql Server 2008_Case_Where Clause - Fatal编程技术网

Sql server 如何检查where子句中的条件

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

它在case条件附近抛出错误在case条件附近抛出错误语法

我需要如何检查上述条件?我只需要在

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;