CASE
CASE
계단식 "if-then-else" 문처럼 동작하는 조건 표현식 함수예요. 조건들이 순서대로 평가되고, 어느 조건이 TRUE로 평가되면 평가가 멈추고 해당 결과(THEN 뒤)가 반환돼요.
출처: 공식 문서
본문
계단식 "if-then-else" 문처럼 동작합니다. 더 일반적인 형태에서는 일련의 조건들이 순서대로 평가됩니다. 조건이 TRUE로 평가되면 평가가 멈추고 해당 결과(THEN 뒤)가 반환됩니다. 어떤 조건도 TRUE로 평가되지 않으면 선택적 ELSE 뒤의 결과가 있으면 반환되고, 그렇지 않으면 NULL이 반환됩니다.
두 번째 "축약형(shorthand)" 형태에서는 CASE 뒤의 표현식을 각 WHEN 표현식과 순서대로 비교하다가 하나가 일치하면 해당 결과(THEN 뒤)가 반환됩니다. 어떤 표현식도 일치하지 않으면 선택적 ELSE 뒤의 결과가 있으면 반환되고, 그렇지 않으면 NULL이 반환됩니다.
두 번째 형태에서는 NULL CASE 표현식은 WHEN 표현식 중 하나가 NULL이더라도 어떤 WHEN 표현식과도 일치하지 않습니다.
참고 (See also): IFF
구문 (Syntax)
CASE
WHEN <condition1> THEN <result1>
[ WHEN <condition2> THEN <result2> ]
[ ... ]
[ ELSE <result3> ]
END
CASE <expr>
WHEN <value1> THEN <result1>
[ WHEN <value2> THEN <result2> ]
[ ... ]
[ ELSE <result3> ]
END
인자 (Arguments)
CASE의 첫 번째 형태에서 각 조건은 BOOLEAN 값(True, False 또는 NULL)으로 평가되어야 하는 표현식입니다.
일반적인 표현식입니다.
CASE의 두 번째 형태에서 각 값은 expr의 잠재적 일치 값입니다. 값은 리터럴 또는 표현식일 수 있습니다. 값은 expr과 같은 데이터 타입이어야 하거나, expr의 데이터 타입으로 형변환될 수 있는 데이터 타입이어야 합니다.
CASE 절의 첫 번째 형태에서 condition#이 true이면 함수는 해당 result#을 반환합니다. 조건이 두 개 이상 true이면 첫 번째 true 조건과 연관된 결과가 반환됩니다.
CASE 문의 두 번째 형태에서 value#이 expr과 일치하면 해당 결과가 반환됩니다. 값이 두 개 이상 expr과 일치하면 첫 번째 일치 값의 결과가 반환됩니다.
결과는 단일 값으로 평가되는 표현식이어야 합니다.
CASE의 두 형태 모두에서 선택적 ELSE 절이 있고 일치하는 것이 없으면 함수는 ELSE 절의 결과를 반환합니다. ELSE 절이 없고 일치하는 것이 없으면 결과는 NULL입니다.
사용 참고 사항 (Usage notes)
-
DECODE와 달리, 조건의 NULL 값은 조건의 다른 곳의 NULL 값과 일치하지 않습니다. 예를 들어 WHEN <null_expr> = NULL THEN 'Return me!' 는 "Return me!"를 반환하지 않습니다. NULL 값과 비교하려면 = NULL 대신 IS NULL을 사용하세요.
-
condition#, expr, value, result는 모두 일반적인 표현식일 수 있으므로 UNION, INTERSECT, EXCEPT, MINUS 같은 집합 연산자를 포함하는 서브쿼리를 포함할 수 있습니다. 집합 연산자를 사용할 때는 데이터 타입이 호환되는지 확인하세요. 자세한 내용은 Set operators 항목의 General usage notes를 참고하세요.
정렬 규칙 세부 사항 (Collation details)
CASE의 첫 번째 형태에서 각 표현식은 독립적이며, 서로 다른 분기의 정렬 규칙(collation) 지정도 독립적입니다. 예를 들어 다음에서 condition1의 정렬 규칙 지정은 condition2의 정렬 규칙 지정과 독립적이며, 그 정렬 규칙 지정들은 동일하거나 호환될 필요가 없습니다.
CASE
WHEN <condition1> THEN <result1>
[ WHEN <condition2> THEN <result2> ]
CASE의 두 번째 형태에서는 모든 정렬 규칙 관련 연산이 호환 가능한 정렬 규칙 지정을 사용해야 하지만, 정렬 규칙 지정이 동일할 필요는 없습니다. 예를 들어 다음 문에서 value1과 value2의 정렬 규칙 지정은 모두 expr의 정렬 규칙 지정과 호환되어야 하지만, value1과 value2의 정렬 규칙 지정은 서로 또는 expr의 정렬 규칙 지정과 동일할 필요는 없습니다.
CASE <expr>
WHEN <value1> THEN <result1>
[ WHEN <value2> THEN <result2> ]
...
함수가 반환하는 값은 THEN/ELSE 인자들 중 최고 우선순위 정렬 규칙을 가집니다.
예제 (Examples)
이 예제는 CASE의 일반적인 사용을 보여줍니다:
SELECT
column1,
CASE
WHEN column1=1 THEN 'one'
WHEN column1=2 THEN 'two'
ELSE 'other'
END AS result
FROM (values(1),(2),(3)) v;
+---------+--------+
| COLUMN1 | RESULT |
|---------+--------|
| 1 | one |
| 2 | two |
| 3 | other |
+---------+--------+
이 예제는 어떤 값도 일치하지 않고 ELSE 절이 없으면 반환되는 값이 NULL임을 보여줍니다:
SELECT
column1,
CASE
WHEN column1=1 THEN 'one'
WHEN column1=2 THEN 'two'
END AS result
FROM (values(1),(2),(3)) v;
+---------+--------+
| COLUMN1 | RESULT |
|---------+--------|
| 1 | one |
| 2 | two |
| 3 | NULL |
+---------+--------+
이 예제는 NULL을 명시적으로 처리합니다.
SELECT
column1,
CASE
WHEN column1 = 1 THEN 'one'
WHEN column1 = 2 THEN 'two'
WHEN column1 IS NULL THEN 'NULL'
ELSE 'other'
END AS result
FROM VALUES (1), (2), (NULL);
+---------+--------+
| COLUMN1 | RESULT |
|---------+--------|
| 1 | one |
| 2 | two |
| NULL | NULL |
+---------+--------+
다음 예제들은 CASE와 정렬 규칙을 결합합니다:
SELECT CASE COLLATE('m', 'upper')
WHEN 'M' THEN TRUE
ELSE FALSE
END;
+----------------------------+
| CASE COLLATE('M', 'UPPER') |
| WHEN 'M' THEN TRUE |
| ELSE FALSE |
| END |
|----------------------------|
| True |
+----------------------------+
SELECT CASE 'm'
WHEN COLLATE('M', 'lower') THEN TRUE
ELSE FALSE
END;
+------------------------------------------+
| CASE 'M' |
| WHEN COLLATE('M', 'LOWER') THEN TRUE |
| ELSE FALSE |
| END |
|------------------------------------------|
| True |
+------------------------------------------+