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

SQL:WHERE子句中的IF子句

如何解决《SQL:WHERE子句中的IF子句》经验,为你挑选了5个好方法。

是否可以在MS SQL中的WHERE子句中使用IF子句?

例:

WHERE
    IF IsNumeric(@OrderNumber) = 1
        OrderNumber = @OrderNumber
    ELSE
        OrderNumber LIKE '%' + @OrderNumber + '%'

bdukes.. 204

使用CASE语句
更新:以前的语法(由少数人指出)不起作用.您可以按如下方式使用CASE:

WHERE OrderNumber LIKE
  CASE WHEN IsNumeric(@OrderNumber) = 1 THEN 
    @OrderNumber 
  ELSE
    '%' + @OrderNumber
  END

或者您可以使用像@ NJ Reed指出的IF语句.



1> bdukes..:

使用CASE语句
更新:以前的语法(由少数人指出)不起作用.您可以按如下方式使用CASE:

WHERE OrderNumber LIKE
  CASE WHEN IsNumeric(@OrderNumber) = 1 THEN 
    @OrderNumber 
  ELSE
    '%' + @OrderNumber
  END

或者您可以使用像@ NJ Reed指出的IF语句.



2> njr101..:

您应该能够在没有任何IF或CASE的情况下执行此操作

 WHERE 
   (IsNumeric(@OrderNumber) AND
      (CAST OrderNumber AS VARCHAR) = (CAST @OrderNumber AS VARCHAR)
 OR
   (NOT IsNumeric(@OrderNumber) AND
       OrderNumber LIKE ('%' + @OrderNumber))

根据SQL的风格,您可能需要将订单号上的强制转换调整为INT或VARCHAR,具体取决于是否支持隐式强制转换.

这是WHERE子句中非常常见的技术.如果要在WHERE子句中应用一些"IF"逻辑,您需要做的就是将带有布尔AND的额外条件添加到需要应用它的部分.


我想你会比CASE解决方案受到一点性能影响,因为所有这些条件都得到了评估,不是吗?

3> 小智..:

您根本不需要IF语句.

WHERE
    (IsNumeric(@OrderNumber) = 1 AND OrderNumber = @OrderNumber)
OR (IsNumeric(@OrderNumber) = 0 AND OrderNumber LIKE '%' + @OrderNumber + '%')



4> Euro Micelli..:

在SQL中没有一种好方法可以做到这一点.我看到的一些方法:

1)使用CASE结合布尔运算符:

WHERE
    OrderNumber = CASE 
        WHEN (IsNumeric(@OrderNumber) = 1)
        THEN CONVERT(INT, @OrderNumber)
        ELSE -9999 -- Some numeric value that just cannot exist in the column
    END
    OR 
    FirstName LIKE CASE
        WHEN (IsNumeric(@OrderNumber) = 0)
        THEN '%' + @OrderNumber
        ELSE ''
    END

2)在SELECT之外使用IF

IF (IsNumeric(@OrderNumber)) = 1
BEGIN
    SELECT * FROM Table
    WHERE @OrderNumber = OrderNumber
END ELSE BEGIN
    SELECT * FROM Table
    WHERE OrderNumber LIKE '%' + @OrderNumber
END

3)使用长字符串,有条件地编写SQL语句,然后使用EXEC

第三种方法很可怕,但如果您有许多可变条件,这几乎是唯一可行的方法.



5> Joel Coehoor..:

使用CASE语句而不是IF.

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