SQL:WHERE子句中的IF子句

MS SQL中的WHERE子句中可以使用IF子句吗?

例:

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

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

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

或者你可以使用@NJ Reed指出的IF语句。


您应该可以在没有任何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加到需要应用的部分。


在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

第三种方法是可怕的,但它几乎是唯一的思维,如果你有这样的变量条件的数量。

链接地址: http://www.djcxy.com/p/44017.html

上一篇: SQL: IF clause within WHERE clause

下一篇: Why select top ... order by indexed column still sort?