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;