SQL 내에서의 IF이라고도 할 수있는 CASE 표현식은
Oracle 9i 이전부터 있는 단순 CASE 표현식,
Oracle 9i 이후에 구현 된 검색 CASE 표현식 등 2 종류가있다.
또한 PL / SQL에서도 CASE 문장을 지원하고 있다.
SELECT 목록에 설명 할 수 있는 것은 물론, LIKE 등의 조건식과 CASE 표현식을 병행하여
WHERE 절과 GROUP BY, HAVING 또는 ORDER BY 절에 기술하는 것으로 분류에 의한 다른 수식이나 값으로
업데이트 조건에 의한 추출 과 정렬 등 매우 강력한 SQL을 작성할 수 있다.
단순 CASE 표현식 (simple case expression)
CASE에 지정된 표현식 expr 수식의 값과 비교할 식의 값 comparison_expr1 를 매칭시켜
해당하는 값을 갖는 위치의 반환 값 ret_expr1 을 리턴하는 표현식이다. (Oracle 8i 이전에도 사용할 수있다)
단순 CASE 표현식은 DECODE 함수를 사용하는 것보다 쉽게 쓸 수있다.
그러나 몇 개 이상을 비교하거나 NULL로 비교를 하는 경우 DECODE 함수 도 많은 인기가 있다.
표현식 expr 의 값을 바탕으로 분기하는 단순 CASE 문은
IF의 나열이나 SELECT 를 동반 DECODE 함수를 사용하는 것보다 보기 쉽고, 더 빠르게 작동한다.
CASE 표현식의 형식
CASE expr - 여기에 식 (expr)에서 WHEN도 식
WHEN comparison_expr1 THEN return_expr1
WHEN comparison_expr2 THEN return_expr2
ELSE return_default_expr
END
-
컬러 코드를 이름으로 변환하는 CASE 표현식의 예
SQL> select
2 color_code, - 컬러 코드
3 CASE color_code
4 WHEN 'FFF' THEN 'WHITE' - FFF이라면 흰색
5 WHEN '000' THEN 'BACK' - 000이라면 검정
6 ELSE color_code - 그 이외라면 코드 값을 리턴
7 END color_name
8 from
9 color_sample;
COLOR_CODE COLOR_NAME
---------- ----------
FFF WHITE
000 BACK
F00 F00
0F0 0F0
00F 00F
주의
단순 CASE 표현식에서 비교 식 comparison_expr 및 반환 return_expr , default_expr 은
NULL 값을 설명 할 수 없다. NULL = NULL의 조건은 NULL이 되기 위해 평가되지 않는다.
검색 CASE 표현식 (searched case expression)
평가 조건이 각각 다른 것 ( expr1 = expr2 의 형식이되지 않아도)
단순 CASE 표현식과 비교하면 수식 expr 의 유무와 식 comparison_expr1 인지
조건문 condition1 에서 미묘하게 다르다.
검색 CASE 표현식의 형식
CASE - 여기 expr의 표기가없고 WHEN 조건
WHEN condition1 THEN return_expr1
WHEN condition2 THEN return_expr2
ELSE retun default_expr
END
그 밖에도 condition1 은 IS NULL 또는 IN, LIKE 등 설명도 가능
검색 CASE 표현식을 이용한 가족 구성을 나타낸 예 (CASE 표현식은 단락 평가)
SQL> select
2 age, gender,
3 CASE
4 WHEN age <= 15 THEN 'child' -- 15세 이하
5 WHEN age < 20 THEN 'young' -- 20세 이상
6 WHEN gender = 'F' THEN 'lady' -- 여자
7 WHEN gender = 'M' THEN 'gentleman' -- 남자
8 ELSE 'ze' -- 미상
9 END status
10 from
11 family;
AGE GENDER STATUS
---------- ------ ----------
1 F child
13 M child
19 M young
38 F lady
39 M gentleman
<NULL> <NULL> ze
PL / SQL 에 CASE 표현식이 사용할 수 Oracle 9i 이상
Oracle 9i 이전 PL / SQL 파서는 SQL 파서와 다르기 때문이다.
따라서 PL / SQL에 직접 포함 된 SQL (임베디드 SQL)에서 일부 SQL 구문이 지원되지 않는다는 것을 알고있다.
Oracle 9i 이후 파서가 통합되어 있기 때문에 일부 기능을 사용할 수 없는 것은 아니라고 생각된다.