복붙노트

[SQL] 어떻게 SQL SELECT에서 THEN ...는 IF를 수행합니까?

SQL

어떻게 SQL SELECT에서 THEN ...는 IF를 수행합니까?

어떻게 SQL SELECT 문에서 THEN ...는 IF를 수행합니까?

예를 들면 :

SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product

해결법

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

    1.case 문은 SQL의 IF에 가장 가까운과 SQL Server의 모든 버전에서 지원됩니다.

    case 문은 SQL의 IF에 가장 가까운과 SQL Server의 모든 버전에서 지원됩니다.

    SELECT CAST(
                 CASE
                      WHEN Obsolete = 'N' or InStock = 'Y'
                         THEN 1
                      ELSE 0
                 END AS bit) as Saleable, *
    FROM Product
    

    당신은 당신이 부울 값으로 결과를 원하는 경우 CAST를 할 필요가있다. 당신이 int로 만족하면,이 작품 :

    SELECT CASE
                WHEN Obsolete = 'N' or InStock = 'Y'
                   THEN 1
                   ELSE 0
           END as Saleable, *
    FROM Product
    

    CASE 문은 다른 CASE 문에 포함하고도 집계에 포함 할 수 있습니다.

    SQL 서버 데날리 (2012 SQL 서버)도 액세스 (마틴 스미스에 의해 지적)에서 사용할 수있는 IIF 문을 추가합니다 :

    SELECT IIF(Obsolete = 'N' or InStock = 'Y', 1, 0) as Saleable, * FROM Product
    
  2. ==============================

    2.케이스 문은이 상황에서 당신의 친구, 그리고 두 가지 형태 중 하나를 취합니다

    케이스 문은이 상황에서 당신의 친구, 그리고 두 가지 형태 중 하나를 취합니다

    간단한 경우 :

    SELECT CASE <variable> WHEN <value>      THEN <returnvalue>
                           WHEN <othervalue> THEN <returnthis>
                                             ELSE <returndefaultcase>
           END AS <newcolumnname>
    FROM <table>
    

    확장 된 경우 :

    SELECT CASE WHEN <test>      THEN <returnvalue>
                WHEN <othertest> THEN <returnthis>
                                 ELSE <returndefaultcase>
           END AS <newcolumnname>
    FROM <table>
    

    당신은 정말 멋진 주문에 대한 order by 절에 case 문을 넣을 수 있습니다.

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

    3.SQL 서버 2012에서 당신은이에 대한 IIF 기능을 사용할 수 있습니다.

    SQL 서버 2012에서 당신은이에 대한 IIF 기능을 사용할 수 있습니다.

    SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
    FROM   Product
    

    이것은 효과적으로 (하지 표준 SQL 불구하고) 그냥 속기 CASE를 작성하는 방법입니다.

    확장 된 CASE 버전과 비교했을 때 나는 간결함을 선호합니다.

    그리고 SQL 문 내에서 식으로 두 IIF () 및 CASE의 해결은 잘 정의 된 장소에서 사용할 수 있습니다.

    사용자의 요구가 이러한 제한에 의해 만족 될 수없는 경우 SQL Server는 키워드 IF 절차가 않습니다 (예를 들어, 필요 어떤 조건에 따라 다른 모양의 결과 집합을 반환합니다).

    IF @IncludeExtendedInformation = 1
      BEGIN
          SELECT A,B,C,X,Y,Z
          FROM   T
      END
    ELSE
      BEGIN
          SELECT A,B,C
          FROM   T
      END
    

    케어는 때때로 그러나이 방법으로 문제를 스니핑 매개 변수 않도록주의해야합니다.

  4. ==============================

    4.당신은 SQL CASE 문의 힘에 몇 가지 좋은 예를 찾을 수 있습니다, 그리고 당신이 (4guysfromrolla에서) 이런 식으로 뭔가를 할 것이다 사용할 수있는 문을 생각한다 :

    당신은 SQL CASE 문의 힘에 몇 가지 좋은 예를 찾을 수 있습니다, 그리고 당신이 (4guysfromrolla에서) 이런 식으로 뭔가를 할 것이다 사용할 수있는 문을 생각한다 :

    SELECT
        FirstName, LastName,
        Salary, DOB,
        CASE Gender
            WHEN 'M' THEN 'Male'
            WHEN 'F' THEN 'Female'
        END
    FROM Employees
    
  5. ==============================

    5.사용 사례. 이 같은.

    사용 사례. 이 같은.

    SELECT Salable =
            CASE Obsolete
            WHEN 'N' THEN 1
            ELSE 0
        END
    
  6. ==============================

    6.

    SELECT  
    (CASE 
         WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES'
                                                ELSE 'NO' 
     END) as Salable
    , * 
    FROM Product
    
  7. ==============================

    7.마이크로 소프트 SQL 서버 (T-SQL)

    마이크로 소프트 SQL 서버 (T-SQL)

    선별, 사용 :

    select case when Obsolete = 'N' or InStock = 'Y' then 'YES' else 'NO' end
    

    where 절에서 사용 :

    where 1 = case when Obsolete = 'N' or InStock = 'Y' then 1 else 0 end
    
  8. ==============================

    8.

     SELECT
       CASE 
          WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE' 
          ELSE 'FALSE' 
       END AS Salable,
       * 
    FROM PRODUCT
    
  9. ==============================

    9.이 링크에서, 우리는 T-SQL에서 THEN ELSE IF를 이해할 수있다 :

    이 링크에서, 우리는 T-SQL에서 THEN ELSE IF를 이해할 수있다 :

    IF EXISTS(SELECT *
              FROM   Northwind.dbo.Customers
              WHERE  CustomerId = 'ALFKI')
      PRINT 'Need to update Customer Record ALFKI'
    ELSE
      PRINT 'Need to add Customer Record ALFKI'
    
    IF EXISTS(SELECT *
              FROM   Northwind.dbo.Customers
              WHERE  CustomerId = 'LARSE')
      PRINT 'Need to update Customer Record LARSE'
    ELSE
      PRINT 'Need to add Customer Record LARSE' 
    

    되지는 T-SQL이 좋은의 충분한가요?

  10. ==============================

    10.SQL Server의 간단한 경우-else 문 :

    SQL Server의 간단한 경우-else 문 :

    DECLARE @val INT;
    SET @val = 15;
    
    IF @val < 25
    PRINT 'Hi Ravi Anand';
    ELSE
    PRINT 'By Ravi Anand.';
    
    GO
    

    중첩하면 ... SQL Server의 else 문 -

    DECLARE @val INT;
    SET @val = 15;
    
    IF @val < 25
    PRINT 'Hi Ravi Anand.';
    ELSE
    BEGIN
    IF @val < 50
      PRINT 'what''s up?';
    ELSE
      PRINT 'Bye Ravi Anand.';
    END;
    
    GO
    
  11. ==============================

    11.case 문을 사용합니다 :

    case 문을 사용합니다 :

    SELECT CASE
           WHEN (Obsolete = 'N' OR InStock = 'Y')
           THEN 'Y'
           ELSE 'N'
    END as Available
    
    etc...
    
  12. ==============================

    12.새로운 기능, IIF는 (우리가 간단하게 사용할 수있는) 2012 SQL 서버에서 추가되었다 :

    새로운 기능, IIF는 (우리가 간단하게 사용할 수있는) 2012 SQL 서버에서 추가되었다 :

    SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
    
  13. ==============================

    13.순수 비트 로직을 사용하여

    순수 비트 로직을 사용하여

    DECLARE @Product TABLE (
        id INT PRIMARY KEY IDENTITY NOT NULL
       ,Obsolote CHAR(1)
       ,Instock CHAR(1)
    )
    
    INSERT INTO @Product ([Obsolote], [Instock])
        VALUES ('N', 'N'), ('N', 'Y'), ('Y', 'Y'), ('Y', 'N')
    
    ;
    WITH cte
    AS
    (
        SELECT
            'CheckIfInstock' = CAST(ISNULL(NULLIF(ISNULL(NULLIF(p.[Instock], 'Y'), 1), 'N'), 0) AS BIT)
           ,'CheckIfObsolote' = CAST(ISNULL(NULLIF(ISNULL(NULLIF(p.[Obsolote], 'N'), 0), 'Y'), 1) AS BIT)
           ,*
        FROM
            @Product AS p
    )
    SELECT
        'Salable' = c.[CheckIfInstock] & ~c.[CheckIfObsolote]
       ,*
    FROM
        [cte] c
    

    작업 데모를 참조하십시오 경우 SQL Server의 경우없이.

    시작를 들어, 선택된 조건 실제의 값과 거짓을 해결해야합니다. 여기에 두 NULLIF 온다 :

    for true: ISNULL(NULLIF(p.[Instock], 'Y'), 1)
    for false: ISNULL(NULLIF(p.[Instock], 'N'), 0)
    

    함께 결합하여 1 또는 0 다음 사용 비트 연산자를 제공한다.

    그것은 가장 WYSIWYG 방식입니다.

  14. ==============================

    14.

    SELECT 1 AS Saleable, *
      FROM @Product
     WHERE ( Obsolete = 'N' OR InStock = 'Y' )
    UNION
    SELECT 0 AS Saleable, *
      FROM @Product
     WHERE NOT ( Obsolete = 'N' OR InStock = 'Y' )
    
  15. ==============================

    15.

    SELECT CASE WHEN profile.nrefillno = 0 THEN 'N' ELSE 'R'END as newref
    From profile
    
  16. ==============================

    16.

    case statement some what similar to if in SQL server
    
    SELECT CASE 
                WHEN Obsolete = 'N' or InStock = 'Y' 
                   THEN 1 
                   ELSE 0 
           END as Saleable, * 
    FROM Product
    
  17. ==============================

    17.이 답변, 내가 작업 사용에 CASE 문 단지 예 아니다. 그것은 중첩 된 CASE 문이있다. 지금 당신은 내 눈이 교차하는 이유를 알고있다.

    이 답변, 내가 작업 사용에 CASE 문 단지 예 아니다. 그것은 중첩 된 CASE 문이있다. 지금 당신은 내 눈이 교차하는 이유를 알고있다.

     CASE orweb2.dbo.Inventory.RegulatingAgencyName
        WHEN 'Region 1'
            THEN orweb2.dbo.CountyStateAgContactInfo.ContactState
        WHEN 'Region 2'
            THEN orweb2.dbo.CountyStateAgContactInfo.ContactState
        WHEN 'Region 3'
            THEN orweb2.dbo.CountyStateAgContactInfo.ContactState
        WHEN 'DEPT OF AGRICULTURE'
            THEN orweb2.dbo.CountyStateAgContactInfo.ContactAg
        ELSE (
                CASE orweb2.dbo.CountyStateAgContactInfo.IsContract
                    WHEN 1
                        THEN orweb2.dbo.CountyStateAgContactInfo.ContactCounty
                    ELSE orweb2.dbo.CountyStateAgContactInfo.ContactState
                    END
                )
        END AS [County Contact Name]
    
  18. ==============================

    18.당신은 오히려 다른 하나 개의 테이블에서 오라클 11.2g에서이 작품을 결과를 전송하는 것보다, 처음으로 테이블에 결과를 삽입하는 경우 :

    당신은 오히려 다른 하나 개의 테이블에서 오라클 11.2g에서이 작품을 결과를 전송하는 것보다, 처음으로 테이블에 결과를 삽입하는 경우 :

    INSERT INTO customers (last_name, first_name, city)
        SELECT 'Doe', 'John', 'Chicago' FROM dual
        WHERE NOT EXISTS 
            (SELECT '1' from customers 
                where last_name = 'Doe' 
                and first_name = 'John'
                and city = 'Chicago');
    
  19. ==============================

    19.case 문에 대한 대안 솔루션으로서, 테이블 중심의 접근 방식은 사용할 수 있습니다 :

    case 문에 대한 대안 솔루션으로서, 테이블 중심의 접근 방식은 사용할 수 있습니다 :

    DECLARE @Product TABLE (ID INT, Obsolete VARCHAR(10), InStock VARCHAR(10))
    INSERT INTO @Product VALUES
    (1,'N','Y'),
    (2,'A','B'),
    (3,'N','B'),
    (4,'A','Y')
    
    SELECT P.* , ISNULL(Stmt.Saleable,0) Saleable
    FROM
        @Product P
        LEFT JOIN
            ( VALUES
                ( 'N', 'Y', 1 )
            ) Stmt (Obsolete, InStock, Saleable)
            ON  P.InStock = Stmt.InStock OR P.Obsolete = Stmt.Obsolete
    

    결과:

    ID          Obsolete   InStock    Saleable
    ----------- ---------- ---------- -----------
    1           N          Y          1
    2           A          B          0
    3           N          B          1
    4           A          Y          1
    
  20. ==============================

    20.

    SELECT CASE WHEN Obsolete = 'N' or InStock = 'Y' THEN 1 ELSE 0 
                 END AS Saleable, * 
    FROM Product
    
  21. ==============================

    21.SQL 서버 2012을 사용하는 사람들을 위해, IIF 추가 및 사례 문에 대한 대안으로 작동 된 기능입니다.

    SQL 서버 2012을 사용하는 사람들을 위해, IIF 추가 및 사례 문에 대한 대안으로 작동 된 기능입니다.

    SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
    FROM   Product 
    
  22. ==============================

    22.

      SELECT IIF(Obsolete = 'N' OR InStock = 'Y',1,0) AS Saleable, * FROM Product
    
  23. ==============================

    23.질문:

    질문:

    SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
    

    ANSI :

    Select 
      case when p.Obsolete = 'N' 
      or p.InStock = 'Y' then 1 else 0 end as Saleable, 
      p.* 
    FROM 
      Product p;
    

    별칭을 사용하여 - P는이 경우에하는 - 문제를 방지하는 데 도움이됩니다.

  24. ==============================

    24.당신은 실제로 구현이 두 가지 선택을 할 수 있습니다 :

    당신은 실제로 구현이 두 가지 선택을 할 수 있습니다 :

  25. ==============================

    25.

    SELECT 
      CAST(
        CASE WHEN Obsolete = 'N' 
        or InStock = 'Y' THEN ELSE 0 END AS bit
      ) as Saleable, * 
    FROM 
      Product
    
  26. ==============================

    26.그것은 그런 일이 될 것입니다 :

    그것은 그런 일이 될 것입니다 :

    SELECT OrderID, Quantity,
    CASE
        WHEN Quantity > 30 THEN "The quantity is greater than 30"
        WHEN Quantity = 30 THEN "The quantity is 30"
        ELSE "The quantity is under 30"
    END AS QuantityText
    FROM OrderDetails;
    
  27. ==============================

    27.SQL CASE를 사용하는 것은 단지 보통의 경우, / else 문 같다. 쿼리 아래에서 사용되지 않는 값 = 'N'또는 경우의 inStock 값 경우 = 'Y'나서 출력 1. 그렇지 않으면 0을 출력 할 것이다 것이다. 그런 다음 우리는 판매 가능한 열에서이 0 또는 1의 값을 넣어.

    SQL CASE를 사용하는 것은 단지 보통의 경우, / else 문 같다. 쿼리 아래에서 사용되지 않는 값 = 'N'또는 경우의 inStock 값 경우 = 'Y'나서 출력 1. 그렇지 않으면 0을 출력 할 것이다 것이다. 그런 다음 우리는 판매 가능한 열에서이 0 또는 1의 값을 넣어.

    SELECT
          CASE 
            WHEN obsolete = 'N' OR InStock = 'Y' 
            THEN 1 
            ELSE 0 
          END AS Salable
          , * 
    FROM PRODUCT
    
  28. ==============================

    28.완전성을 위해, 나는 SQL이 3 치 논리를 사용하는 추가합니다. 표현식:

    완전성을 위해, 나는 SQL이 3 치 논리를 사용하는 추가합니다. 표현식:

    obsolete = 'N' OR instock = 'Y'
    

    세 가지 결과를 생산할 수 :

    | obsolete | instock | saleable |
    |----------|---------|----------|
    | Y        | Y       | true     |
    | Y        | N       | false    |
    | Y        | null    | null     |
    | N        | Y       | true     |
    | N        | N       | true     |
    | N        | null    | true     |
    | null     | Y       | true     |
    | null     | N       | null     |
    | null     | null    | null     |
    

    그래서 예를 들어 제품은 사용되지 않지만 제품은 제품이 팔리는 경우 다음 몰라요 때문에 inStock 경우 당신은 몰라요합니다. 다음과 같이이 3 치 논리를 작성할 수 있습니다 :

    SELECT CASE
               WHEN obsolete = 'N' OR instock = 'Y' THEN 'true'
               WHEN NOT (obsolete = 'N' OR instock = 'Y') THEN 'false'
               ELSE NULL
           END AS saleable
    

    그것이 어떻게 작동하는지 당신이 파악되면, 당신은 널 (null)의 동작을 결정하여 두 결과 세 가지 결과를 변환 할 수 있습니다. 예를 들면 이 팔리는하지으로 널 (null)을 치료하는 것입니다 :

    SELECT CASE
               WHEN obsolete = 'N' OR instock = 'Y' THEN 'true'
               ELSE 'false' -- either false or null
           END AS saleable
    
  29. from https://stackoverflow.com/questions/63447/how-do-i-perform-an-if-then-in-an-sql-select by cc-by-sa and MIT license