是否可以在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语句.
使用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的额外条件添加到需要应用它的部分.
您根本不需要IF语句.
WHERE (IsNumeric(@OrderNumber) = 1 AND OrderNumber = @OrderNumber) OR (IsNumeric(@OrderNumber) = 0 AND OrderNumber LIKE '%' + @OrderNumber + '%')
在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
第三种方法很可怕,但如果您有许多可变条件,这几乎是唯一可行的方法.
使用CASE语句而不是IF.