SQL:WHERE子句中的IF子句
时间:2020-03-05 19:00:06 来源:igfitidea点击:
是否可以在MS SQL的WHERE子句中使用IF子句?
例子:
WHERE IF IsNumeric(@OrderNumber) = 1 OrderNumber = @OrderNumber ELSE OrderNumber LIKE '%' + @OrderNumber + '%'
解决方案
回答
使用CASE语句代替IF。
回答
使用CASE语句
更新:先前的语法(如少数人指出的那样)不起作用。我们可以按如下方式使用CASE:
WHERE OrderNumber LIKE CASE WHEN IsNumeric(@OrderNumber) = 1 THEN @OrderNumber ELSE '%' + @OrderNumber END
或者我们可以使用@N之类的IF语句。 J.里德指出。
回答
我们需要CASE语句
WHERE OrderNumber LIKE CASE WHEN IsNumeric(@OrderNumber)=1 THEN @OrderNumber ELSE '%' + @OrderNumber END
回答
我们应该能够在没有任何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
第三种方法令人毛骨悚然,但是如果我们有许多类似的可变条件,它几乎是唯一可行的方法。
回答
我认为在...喜欢/ = ...情况下...那么...可以使用布尔值。我正在使用T-SQL。
场景:假设如果bool为假,则要获得Person-30的爱好,如果bool为真,则要获得Person-42的爱好。 (根据某些资料,爱好查找占业务计算周期的90%以上,因此要付出很大的努力。)
CREATE PROCEDURE sp_Case @bool bit AS SELECT Person.Hobbies FROM Person WHERE Person.ID = case @bool when 0 then 30 when 1 then 42 end;