수색…
소개
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로 사용하십시오.
사용 사례
CASE
는 SUM
과 함께 사용하여 미리 정의 된 조건과 일치하는 항목 만 계산할 수 있습니다. 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
식은 Date1
및 Date2
열을보고 더 낮은 값을 갖는 열을 확인하고이 값에 따라 레코드를 정렬합니다.
샘플 데이터
신분증 | 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
인 행이 두 번째입니다. 이는 Date2
가 2017-01-02
와 같으므로 테이블에서 두 번째로 낮은 값입니다. 등등.
그래서 우리의 레코드 분류 한 2017-01-01
에 2017-01-06
한 열에있는 상승없이 치료 Date1
이나 Date2
그 가치됩니다.