当前位置:  开发笔记 > 数据库 > 正文

SQL - WHERE中的CASE表达式

如何解决《SQL-WHERE中的CASE表达式》经验,为你挑选了2个好方法。

我在这里阅读了有关在WHERE子句中使用CASE表达式的内容:

http://scottelkin.com/sql/using-a-case-statement-in-a-sql-where-clause/

我正在尝试使用它来根据用户应用程序传递的合同号来过滤select语句的结果.我的代码当前抛出了'无效参数'的错误,无论传入什么.我验证SELECT/FROM工作正常,如没有CASE表达式的WHERE子句.这是我的代码.

WHERE     (CASE WHEN @ContractNo = 0 THEN @ContractNo ELSE @ContractNo END =
tblContracts.ContractNo)

代码的冗余用于故障排除,我打算稍后在CASE上使用通配符过滤.我正专注于立即降低语法.我相信这应该返回参数与表中存储的合同号匹配的所有记录.任何帮助或建议将不胜感激.



1> casperOne..:

你确定你要这么做吗?您的案例陈述总是返回@ContractNo.我认为你在寻找的是:

where 
    case @ContractNo 
        when 0 then tblContracts.ContractNo 
        else @ContractNo 
    end = tblContracts.ContractNo

上面的过滤器说"给我合同,其中ContractNo等于参数,或者如果参数为0则全部给我.

仅过滤合同编号字段与参数完全相等的前一过滤器.

无论如何,你应该这样做:

where @ContractNo = 0 or @ContractNo = tblContracts.ContractNo

逻辑更容易理解,除此之外(不要引用我),优化器可能会在case语句之外更好地工作.



2> recursive..:

阅读完解释后,有一个更好的方法可以做到这一点CASE:

WHERE @ContractNo = 0 OR tblContracts.ContractNo = @ContractNo

这将只返回匹配的合同号,除非@ContractNo是0,在这种情况下它将返回所有记录.

编辑:我刚刚注意到casperOne提出了同样的事情.我没有看到.大自己.

推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有