Sql server Isnull-where子句的大小写和条件

Sql server Isnull-where子句的大小写和条件,sql-server,Sql Server,我有一个代码片段,其中有一组与and子句合并的where条件。我要执行以下操作: ... and admission_date > release_date and case when @sample = 'typeA' then ( (isnull(@toll_id, 0) > 0 and exists(select fk_id from dbo.tollitem where t

我有一个代码片段,其中有一组与and子句合并的where条件。我要执行以下操作:

...     
     and admission_date > release_date
     and case when @sample = 'typeA'
            then 
            (
            (isnull(@toll_id, 0) > 0 and exists(select fk_id from dbo.tollitem where toll_id = @toll_id and isdel=0))
            or 
            (isnull(@toll_id, 0) = 0)
            )
因此,我有一个参数@Sample,它有两个值-类型a或类型B。我只想在@Sample=typeA时检查where子句的条件。
上面是我的代码,我得到了不正确的语法错误。有什么帮助吗?

您一定要将其改写为:

and admission_date > release_date
     and  
       (@sample = 'typeA' and
            (((isnull(@toll_id, 0) > 0 and exists(select fk_id from dbo.tollitem where toll_id = @toll_id and isdel=0))
            or 
            (isnull(@toll_id, 0) = 0)
            )))

这不是
案例
表达式的工作方式。在
WHERE
子句中,您仍然需要生成一个布尔表达式。因此:

WHERE CASE WHEN Col1 = 1 THEN Col2 = 2 OR Col3 = 3 ELSE Col4 = 1 END;
是完全错误的,
案例
仅完成表达式的一侧,并且在时尝试计算
中的布尔表达式。当
返回值而不是布尔值时,返回一个
。正确使用
案例
(与上述示例无关):

这有点像是在暗中拍摄,但我想你想要的是:

AND admission_date > release_date
AND (@sample = 'typeA'
AND  ((isnull(@toll_id, 0) > 0 AND EXISTS(SELECT fk_id
                                          FROM dbo.tollitem
                                          WHERE toll_id = @toll_id
                                            AND isdel=0))
 OR  (isnull(@toll_id, 0) = 0)))

发布您收到的错误消息。您缺少该案例的结束语句。缺少
END
关键字?对不起。我在“>”附近遇到了不正确的语法错误,其他部分只是选择“1”。我没有其他部分的特定代码。此代码的可能副本对我有帮助。但如果我没有错的话,结尾还需要一个括号。@Jiah定义“超出需要”。有时它们是清晰的地方,但不是必需的——但也不会造成任何伤害。Larnu你能编辑代码来显示@sample=typeB吗?@Jiah我很确定你自己能想出如何做到这一点。SO上的志愿者不是来支持他们提供给您的代码的(而且更改文本字符串的值非常简单)。你的工作是确保你理解它并能自己支持它。如果你不理解你提供的代码,你可以询问它,但是如果你仍然不理解,那么我更强烈地建议你不要使用它。完全同意!!我理解给出的解决方案并编辑了我的代码以满足我的要求,但忘了在此处更新:)感谢您的支持
AND admission_date > release_date
AND (@sample = 'typeA'
AND  ((isnull(@toll_id, 0) > 0 AND EXISTS(SELECT fk_id
                                          FROM dbo.tollitem
                                          WHERE toll_id = @toll_id
                                            AND isdel=0))
 OR  (isnull(@toll_id, 0) = 0)))