서론
RDBMS에 준비된 함수를 사용해 데이터를 특정 형태로 변환하는 경우도 있지만, 임의의 조건
에 따라 독자적으로 변환 처리
를 지정해 데이터를 변환하고 싶은 경우도 있을 것이다.
이때 CASE
문을 이용할 수 있다.
1. CASE 문
지금까지 살펴본 다양한 연산자와 함수를 서로 적절히 조합해 사용하면 대부분의 계산을 처리할 수 있었다.
하지만 RDBMS에 갖추어져 있는 기존의 연산자나 함수만으로는 처리할 수 없는 것도 있다.
예를 들면 NULL
값을 0
으로 간주하여 계산하고 싶은 경우가 그렇다.
NULL 값으로 연산한 결과는 모두 NULL이기 때문에 단순한 연산으로는 NULL을 0으로 표현할 방법이 없다.
RDBMS에서는 사용자가 함수
를 작성할 수 있다.
방금 설명한 것과 같은 상황 역시 사용자 정의 함수를 작성해서 해결할 수 있을 것이다.
하지만 간단한 처리의 경우에는 사용자 정의 함수를 작성하지 않고도 CASE
문으로 처리할 수 있다.
우선 예제 CASE 문을 살펴보자.
SELECT *, CASE WHEN a IS NULL THEN 0 ELSE a END AS "a(null=0)" FROM sample_table;
위 명령에서 보이는 것처럼 CASE 문은 'CASE'
키워드로 시작해서 'END'
키워드로 끝난다.
그 다음 WHEN
절에 조건식
을 기술한다.
해당 조건을 만족하여 참이 되는 경우에는 THEN
절에 기술한 식이 처리된다.
이렇듯 CASE 문은 WHEN
절의 조건식을 차례로 평가해 나가다가 가장 먼저 조건을 만족한
WHEN 절과 대응하는 THEN
절 식의 처리 결과를 CASE 문의 결괏값으로 반환한다.
그 어떤 조건식도 만족하지 못한 경우에는 ELSE
절에 기술한 식이 채택된다.
ELSE는 생략 가능
하며 생략했을 경우 'ELSE NULL'
로 간주된다.
위 CASE 문의 실행 결과는 다음과 같다.
2. COALESCE, IFNULL 함수
사실 NULL 값을 반환하는 경우라면 COALESCE
함수나 IFNULL
함수를 사용하는 편이 더 쉽다.
앞의 SELECT 명령 예제를 COALESCE 함수를 사용해 먼저 구현해보겠다.
SELECT a, COALESCE(a, 0) FROM sample_table;
COALESCE 함수는 함수에 주어진 인수들 중에 NULL
값이 있으면 하나씩 지나친 후 '가장 먼저 NULL이 아닌 값'
을 반환한다.
예를 들어 COALESCE(NULL, 1)
일 경우 첫 번째 NULL을 지나치고 1
이 출력되고, COALESCE(2, NULL)
일 경우 지나칠 NULL이 없으므로 2
가 바로 출력된다.
COALESCE(NULL, NULL, 3)
일 경우에는 어떻게 될까?
첫번째, 두번째 NULL을 모두 지나친 후 3
이 출력될 것이다.
따라서 앞의 예문은 a가 NULL이 아니면 a 값을 그대로 출력
하고, 그렇지 않으면(a가 NULL이면) 0
을 출력하게 된다.
IFNULL
함수도 비슷하게 동작하지만 IFNULL 은 딱 두 개
의 인수만 받는데, 각각 'NULL인지 확인할 열'
과 '값이 NULL일 때 대체할 값
'을 받는다.
SELECT a, IFNULL(a, 0) FROM sample_table;
3. 또 하나의 CASE 문
숫자로 이루어진 코드를 알아보기 더 쉽게 문자열로 변환하고 싶은 경우 CASE 문을 많이 사용한다.
예를 들어 특정 열의 값이 '1이면 남자, 2면 여자'
라는 코드 체계가 있다면, 이를 모르는 사람에게 '1'
, '2'
라고 표시하는 것보다 '남자'
, '여자'
라고 표시하는 편이 알아보기 쉬울 것이다.
이와 같이 문자화하는 것을 '디코드'
라 부르고 반대로 수치화하는 것을 '인코드'
라 부른다.
CASE 문은 '검색 CASE'
와 '단순 CASE'
의 두 개 구문으로 나눌 수 있다.
검색 CASE는 앞서 설명한 'CASE WHEN 조건식 THEN 식 ...'
구문이다.
단순 CASE에서는 CASE 뒤에 식을 기술
하고 WHEN 뒤에 (조건식이 아닌) 식을 기술
한다.
그럼 지금부터 성별 문자열을 디코딩하는 예를 살펴보겠다.
먼저 검색 CASE
의 경우이다.
SELECT a AS "코드",
CASE
WHEN a=1 THEN '남자'
WHEN a=2 THEN '여자'
ELSE '미지정'
END AS "성별" FROM sample_table;
다음은 단순 CASE
의 경우이다.
SELECT a AS "코드",
CASE a
WHEN 1 THEN '남자'
WHEN 2 THEN '여자'
ELSE '미지정'
END AS "성별" FROM sample_table;
실행결과는 검색 CASE의 경우와 같다.
4. CASE를 사용할 경우 주의사항
이제까지의 예제에서는 SELECT 구에서 CASE 문을 사용했다.
그러나 CASE 문은 어디에나
사용할 수 있다.
WHERE
구에서 조건식의 일부로 사용될 수도 있고 ORDER BY
구나 SELECT
구에서도 사용할 수 있다.
그럼 CASE를 사용할 경우에 특별히 주의해야 하는 2가지를 간단히 알아보고 이번 챕터를 마무리 하겠다.