수색…


소개

CASE 표현식은 if-then 논리를 구현하는 데 사용됩니다.

통사론

  • 사례 입력 _ 표현식
    비교할 때 1 결과 1
    [비교 2 결과 2] ...
    [ELSE resultX]
    종료
  • 케이스
    조건 1 결과 1
    [조건 2 결과 2] ...
    [ELSE resultX]
    종료

비고

간단한 CASE 표현식compareX 값이 input_expression 과 동일한 첫 번째 결과를 반환합니다.

검색된 CASE 표현식conditionX 가 true 인 첫 번째 결과를 리턴합니다.

SELECT에서 CASE를 검색했습니다 (부울 식과 일치 함).

검색된 CASE는 부울 식이 TRUE 일 때 결과를 반환합니다.

(이는 입력과 동등성 만 검사 할 수있는 단순한 경우와 다릅니다.)

SELECT Id, ItemId, Price,
  CASE WHEN Price < 10 THEN 'CHEAP'
       WHEN Price < 20 THEN 'AFFORDABLE'
       ELSE 'EXPENSIVE'
  END AS PriceRating
FROM ItemSales
신분증 ItemId 가격 PriceRating
1 100 34.5 비싼
2 145 2.3
100 34.5 비싼
4 100 34.5 비싼
5 145 10 저렴한

조건에 일치하는 열의 행 수를 CASE로 사용하십시오.

사용 사례

CASESUM 과 함께 사용하여 미리 정의 된 조건과 일치하는 항목 만 계산할 수 있습니다. Excel에서 COUNTIF 와 유사합니다.

트릭은 일치를 나타내는 바이너리 결과를 반환하는 것이므로 일치하는 항목에 대해 반환되는 "1"을 총 일치 횟수의 합계에 대해 합계 할 수 있습니다.

이 테이블 ItemSales 주어지면 "비싼"것으로 분류 된 항목의 총 수를 알기를 원한다고 가정 해 봅시다.

신분증 ItemId 가격 PriceRating
1 100 34.5 비싼
2 145 2.3
100 34.5 비싼
4 100 34.5 비싼
5 145 10 저렴한

질문

SELECT 
    COUNT(Id) AS ItemsCount,
    SUM ( CASE 
            WHEN PriceRating = 'Expensive' THEN 1
            ELSE 0
          END
        ) AS ExpensiveItemsCount
FROM ItemSales 

결과 :

ItemsCount ExpensiveItemsCount
5

대안 :

SELECT 
    COUNT(Id) as ItemsCount,
    SUM (
        CASE PriceRating 
            WHEN 'Expensive' THEN 1
            ELSE 0
        END
       ) AS ExpensiveItemsCount
FROM ItemSales 

선택의 약어 CASE

CASE 의 속기 변형은 일련의 값에 대한 표현식 (일반적으로 열)을 평가합니다. 이 변형은 조금 더 짧아서 평가 된 표현을 반복해서 반복해서 저장하지 않습니다. 그래도 ELSE 절을 사용할 수 있습니다.

SELECT Id, ItemId, Price,
  CASE Price WHEN 5  THEN 'CHEAP'
             WHEN 15 THEN 'AFFORDABLE'
             ELSE         'EXPENSIVE'
  END as PriceRating
FROM ItemSales

주의 사항. 짧은 변형을 사용할 때 전체 진술은 각 WHEN 에서 평가된다는 것을 깨닫는 것이 중요합니다. 따라서 다음 진술 :

SELECT 
    CASE ABS(CHECKSUM(NEWID())) % 4
        WHEN 0 THEN 'Dr'
        WHEN 1 THEN 'Master'
        WHEN 2 THEN 'Mr'
        WHEN 3 THEN 'Mrs'
    END

NULL 결과를 생성 할 수 있습니다. 그 때문에 각이다 WHEN NEWID() 새로운 결과를 다시 호출되고있다. 다음과 같습니다.

SELECT 
    CASE 
        WHEN ABS(CHECKSUM(NEWID())) % 4 = 0 THEN 'Dr'
        WHEN ABS(CHECKSUM(NEWID())) % 4 = 1 THEN 'Master'
        WHEN ABS(CHECKSUM(NEWID())) % 4 = 2 THEN 'Mr'
        WHEN ABS(CHECKSUM(NEWID())) % 4 = 3 THEN 'Mrs'
    END

따라서 모든 WHEN 경우를 놓칠 수 있으며 결과는 NULL 입니다.

ORDER BY 절의 CASE

1,2,3 ..을 사용하여 주문 유형을 결정할 수 있습니다.

SELECT * FROM DEPT
ORDER BY
CASE DEPARTMENT
      WHEN 'MARKETING' THEN  1
      WHEN 'SALES' THEN 2
      WHEN 'RESEARCH' THEN 3
      WHEN 'INNOVATION' THEN 4
      ELSE        5
      END,
      CITY
신분증 부위 시티 학과 EMPLOYEES_NUMBER
12 뉴 잉글랜드 보스턴 마케팅 9
15 명 웨스트 샌프란시스코 마케팅 12
9 중서부 시카고 매상 8
14 중부 대서양 뉴욕 매상 12
5 웨스트 로스 앤젤레스 연구 11
10 중부 대서양 필라델피아 연구 13
4 중서부 시카고 혁신 11
2 중서부 디트로이트 인적 자원 9

UPDATE에서 CASE 사용하기

가격 인상 샘플 :

UPDATE ItemPrice
SET Price = Price *
  CASE ItemId
    WHEN 1 THEN 1.05
    WHEN 2 THEN 1.10
    WHEN 3 THEN 1.15
    ELSE 1.00
  END

마지막으로 정렬 된 NULL 값의 경우 CASE 사용

이런 방식으로 알려진 값을 나타내는 '0'이 먼저 랭크되고, NULL 값을 나타내는 '1'이 마지막으로 정렬됩니다.

SELECT ID
      ,REGION
      ,CITY
      ,DEPARTMENT
      ,EMPLOYEES_NUMBER
  FROM DEPT
  ORDER BY 
  CASE WHEN REGION IS NULL THEN 1 
  ELSE 0
  END, 
  REGION
신분증 부위 시티 학과 EMPLOYEES_NUMBER
10 중부 대서양 필라델피아 연구 13
14 중부 대서양 뉴욕 매상 12
9 중서부 시카고 매상 8
12 뉴 잉글랜드 보스턴 마케팅 9
5 웨스트 로스 앤젤레스 연구 11
15 명 없는 샌프란시스코 마케팅 12
4 없는 시카고 혁신 11
2 없는 디트로이트 인적 자원 9

ORDER BY 절에서 CASE로 2 열 중 가장 낮은 값으로 레코드 정렬

두 개의 열 중 가장 낮은 값으로 정렬 레코드가 필요하다고 가정 해보십시오. 일부 데이터베이스는이 ( ... ORDER BY MIN(Date1, Date2) )에 대해 집계되지 않은 MIN() 또는 LEAST() 함수를 사용할 수 있지만 표준 SQL에서는 CASE 표현식을 사용해야합니다.

아래 쿼리의 CASE 식은 Date1Date2 열을보고 더 낮은 값을 갖는 열을 확인하고이 값에 따라 레코드를 정렬합니다.

샘플 데이터

신분증 Date1 Date2
1 2017-01-01 2017-01-31
2 2017-01-31 2017-01-03
2017-01-31 2017-01-02
4 2017-01-06 2017-01-31
5 2017-01-31 2017-01-05
6 2017-01-04 2017-01-31

질문

SELECT Id, Date1, Date2
FROM YourTable
ORDER BY CASE 
           WHEN COALESCE(Date1, '1753-01-01') < COALESCE(Date2, '1753-01-01') THEN Date1 
           ELSE Date2 
         END

결과

신분증 Date1 Date2
1 2017-01-01 2017-01-31
2017-01-31 2017-01-02
2 2017-01-31 2017-01-03
6 2017-01-04 2017-01-31
5 2017-01-31 2017-01-05
4 2017-01-06 2017-01-31

설명

Id = 1 행이 가장 먼저 표시되므로, Date1 은 전체 테이블 2017-01-01 에서 가장 낮은 레코드를 가지므로 Id = 3 인 행이 두 번째입니다. 이는 Date22017-01-02 와 같으므로 테이블에서 두 번째로 낮은 값입니다. 등등.

그래서 우리의 레코드 분류 한 2017-01-012017-01-06 한 열에있는 상승없이 치료 Date1 이나 Date2 그 가치됩니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow