代码之家  ›  专栏  ›  技术社区  ›  Bryan Roth

SQL:WHERE子句内的if子句

  •  171
  • Bryan Roth  · 技术社区  · 16 年前

    是否可以使用 如果 A中的子句 哪里 MS SQL中的子句?

    例子:

    WHERE
        IF IsNumeric(@OrderNumber) = 1
            OrderNumber = @OrderNumber
        ELSE
            OrderNumber LIKE '%' + @OrderNumber + '%'
    
    11 回复  |  直到 16 年前
        1
  •  184
  •   Community CDub    8 年前

    使用A CASE 陈述
    更新: 前面的语法(如一些人所指出的)不起作用。您可以如下使用案例:

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

    或者您可以使用if语句@ N. J. Reed 指出。

        2
  •  126
  •   njr101    16 年前

    你应该能够做到这一点而不需要任何条件或情况

     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”逻辑,您需要做的就是用一个布尔值添加额外的条件,并将其添加到需要应用的部分。

        3
  •  17
  •   Rivanni    9 年前

    你根本不需要一个if语句。

    WHERE
        (IsNumeric(@OrderNumber) = 1 AND OrderNumber = @OrderNumber)
    OR (IsNumeric(@OrderNumber) = 0 AND OrderNumber LIKE '%' + @OrderNumber + '%')
    
        4
  •  13
  •   Euro Micelli    16 年前

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

    1)结合布尔运算符的用例:

    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)如果不在选择范围内,则使用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
  •  6
  •   Joel Coehoorn    16 年前

    使用A CASE 语句而不是if。

        6
  •  4
  •   sth    14 年前

    你想要案例陈述

    WHERE OrderNumber LIKE
    CASE WHEN IsNumeric(@OrderNumber)=1 THEN @OrderNumber ELSE '%' + @OrderNumber END
    
        7
  •  3
  •   William    14 年前

    我认为…比如/=…案例…那么…可以和布尔人一起工作。我正在使用T-SQL。

    场景:假设你想得到30人的兴趣爱好,如果bool是假的,那么42人的兴趣爱好,如果bool是真的。(据一些人说,兴趣查询占商业计算周期的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;
    
        8
  •  1
  •   ns12345    14 年前
    其中(isNumeric(@orderNumber)<gt;1或orderNumber=@orderNumber)
    and(isnumber(@ordernumber)=1或ordernumber,如“%”
    +@订单号+'%')
    
        9
  •  0
  •   McDowell rahul gupta    12 年前

    下面的示例将查询作为布尔表达式的一部分执行,然后根据布尔表达式的结果执行稍微不同的语句块。每个语句块以begin开始,以end结束。

    USE AdventureWorks2012;
    GO
    DECLARE @AvgWeight decimal(8,2), @BikeCount int
    IF 
    (SELECT COUNT(*) FROM Production.Product WHERE Name LIKE 'Touring-3000%' ) > 5
    BEGIN
       SET @BikeCount = 
            (SELECT COUNT(*) 
             FROM Production.Product 
             WHERE Name LIKE 'Touring-3000%');
       SET @AvgWeight = 
            (SELECT AVG(Weight) 
             FROM Production.Product 
             WHERE Name LIKE 'Touring-3000%');
       PRINT 'There are ' + CAST(@BikeCount AS varchar(3)) + ' Touring-3000 bikes.'
       PRINT 'The average weight of the top 5 Touring-3000 bikes is ' + CAST(@AvgWeight AS varchar(8)) + '.';
    END
    ELSE 
    BEGIN
    SET @AvgWeight = 
            (SELECT AVG(Weight)
             FROM Production.Product 
             WHERE Name LIKE 'Touring-3000%' );
       PRINT 'Average weight of the Touring-3000 bikes is ' + CAST(@AvgWeight AS varchar(8)) + '.' ;
    END ;
    GO
    

    使用嵌套的if…else语句 下面的示例显示了if_else语句如何嵌套在另一个语句中。将@number变量设置为5、50和500,以测试每个语句。

    DECLARE @Number int
    SET @Number = 50
    IF @Number > 100
       PRINT 'The number is large.'
    ELSE 
       BEGIN
          IF @Number < 10
          PRINT 'The number is small'
       ELSE
          PRINT 'The number is medium'
       END ;
    GO
    
        10
  •  -1
  •   NoNaMe    12 年前
    If @LstTransDt is Null
                    begin
                        Set @OpenQty=0
                    end
                else
                    begin
                       Select   @OpenQty=IsNull(Sum(ClosingQty),0)  
                       From  ProductAndDepotWiseMonitoring  
                       Where   Pcd=@PCd And PtpCd=@PTpCd And TransDt=@LstTransDt      
                    end 
    

    看看这是否有帮助。

        11
  •  -6
  •   kleopatra Aji kattacherry    12 年前
    USE AdventureWorks2012;
    GO
    IF 
    (SELECT COUNT(*) FROM Production.Product WHERE Name LIKE 'Touring-3000%' ) > 5
    PRINT 'There are more than 5 Touring-3000 bicycles.'
    ELSE PRINT 'There are 5 or less Touring-3000 bicycles.' ;
    GO