복붙노트

[SQL] SQL : WHERE 절 내에서 IF 절

SQL

SQL : WHERE 절 내에서 IF 절

그것은 MS SQL에서 WHERE 절 내에서 IF 절을 사용할 수 있습니까?

예:

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

해결법

  1. ==============================

    1.case 문을 사용하여 UPDATE : (몇 사람에 의해 지적) 이전 구문은 작동하지 않습니다. 다음과 같이 CASE를 사용할 수 있습니다 :

    case 문을 사용하여 UPDATE : (몇 사람에 의해 지적) 이전 구문은 작동하지 않습니다. 다음과 같이 CASE를 사용할 수 있습니다 :

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

    또는 당신은 @N 같은 IF 문을 사용할 수 있습니다. J. 리드는 지적한다.

  2. ==============================

    2.당신은 어떤 IF 또는 CASE없이이 작업을 수행 할 수 있어야한다

    당신은 어떤 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"논리를 적용 할 경우, 당신은 부울로하고 적용 할 필요가있는 섹션에 추가 조건을 추가하기 만하면됩니다.

  3. ==============================

    3.당신은 모든에서 IF 문을 필요가 없습니다.

    당신은 모든에서 IF 문을 필요가 없습니다.

    WHERE
        (IsNumeric(@OrderNumber) = 1 AND OrderNumber = @OrderNumber)
    OR (IsNumeric(@OrderNumber) = 0 AND OrderNumber LIKE '%' + @OrderNumber + '%')
    
  4. ==============================

    4.SQL에서이 작업을 수행 할 수있는 좋은 방법이 없습니다. 일부는 내가 본 접근 :

    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)를 사용하는 경우의 외부 SELECT

    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를 사용

    제 3 방식은 끔찍한이지만, 거의 유일한의이 같은 변수 조건의 숫자가있는 경우 그 일을 생각합니다.

  5. ==============================

    5.대신 IF의 CASE 문을 사용합니다.

    대신 IF의 CASE 문을 사용합니다.

  6. ==============================

    6.당신은 CASE 문을 원하는

    당신은 CASE 문을 원하는

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

    7.내가 생각하는 곳 ... 그런 / = ... 경우 ... 다음 ... 부울 작업 할 수 있습니다. 나는 T-SQL을 사용하고 있습니다.

    내가 생각하는 곳 ... 그런 / = ... 경우 ... 다음 ... 부울 작업 할 수 있습니다. 나는 T-SQL을 사용하고 있습니다.

    시나리오 : 부울에 해당하는 경우하자의이 부울이 false 인 경우 당신은 사람-30의 취미를 얻고 싶은 말을하고, 사람-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;
    
  8. ==============================

    8.

    WHERE (IsNumeric(@OrderNumber) <> 1 OR OrderNumber = @OrderNumber) 
                 AND (IsNumber(@OrderNumber) = 1 OR OrderNumber LIKE '%' 
                                                  + @OrderNumber + '%')
    
  9. ==============================

    9.다음은 부울 표현식의 일부로서 질의를 실행하고 부울 식의 결과에 기초하여 약간 다를 문 블록을 실행한다. 각 명령문 블록은 BEGIN과 END로 완료로 시작합니다.

    다음은 부울 표현식의 일부로서 질의를 실행하고 부울 식의 결과에 기초하여 약간 다를 문 블록을 실행한다. 각 명령문 블록은 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 문이 다른 안에 중첩 할 수있는 방법을 다음의 예를 보여줍니다. 각 문장을 테스트하기 위해 5, 50, 500에 @number 변수를 설정합니다.

    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. ==============================

    10.

      WHERE  vfl.CreatedDate >= CASE WHEN @FromDate IS NULL THEN vfl.CreatedDate ELSE  @FromDate END
        AND vfl.CreatedDate<=CASE WHEN @ToDate IS NULL THEN vfl.CreatedDate ELSE @ToDate END 
    
  11. ==============================

    11.

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

    라인의 경우 조건이 제대로 작동합니다.

  12. ==============================

    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 
    

    이 도움이되는지 확인합니다.

  13. ==============================

    13.

    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
    
  14. from https://stackoverflow.com/questions/87821/sql-if-clause-within-where-clause by cc-by-sa and MIT license