임의의 조건에 따라서 독자적으로 변환 처리를 지정해서 데이터를 변환하고 싶을 때
CASE문을 사용할 수 있다.
CASE WHEN 조건식1 THEN 식1
[WHEN 조건식2 THEN 식2...]
[ELSE 식3]
END
예를 들어, NULL값을 0으로 간주해서 계산하고 싶을 때는 어떻게 해야 할까?
NULL값으로 연산한 결과는 모두 NULL이 되는데?
이 경우에 CASE문을 이용해서 처리할 수 있다.
RDBMS에서는 사용자가 함수를 작성할 수 있다.
간단한 처리의 경우에는 사용자 정의 함수를 작성하지 않고 CASE문으로 처리할 수 있다.
WHEN절: 참과 거짓을 반환하는 조건식을 적어준다. 해당 조건을 만족해서 참이 되는 경우, THEN절에 있는 식이 처리된다. 이때 WHEN과 THEN을 한데 조합해 지정할 수 있다. WHEN절의 조건식을 차례로 평가해 나가게 되는데, 가장 먼저 조건을 만족한 WHEN절과 대응하는 THEN절 식의 결과를 CASE문의 결과값으로 반환한다.
만약, 그 어떤 조건식도 만족하지 못할 경우에는 ELSE절의 식이 CASE문의 결과값으로 반환된다.
ELSE절은 생략 가능하고 생략했을 경우에는 기본값으로 ELSE NULL로 처리된다.
SELECT column, CASE WHEN column IS NULL THEN 0 ELSE column END "column(null=0)" FROM table;
SELECT column, COALESCE(column, 0) FROM table;
#단순 CASE로 성별 코드를 남자, 여자로 변환하기
my sql> SELECT column명 AS "코드",
CASE column명
WHEN 1 THEN '남자'
WHEN 2 THEN '여자'
ELSE '미지정'
END AS "성별" FROM table명;
단순 CASE문에서 CASE 뒤에는 대상을 적고 WHEN 뒤에는 값을 적는다.
CASE문의 ELSE는 생략하지 않는 편이 낫다!
#단순 CASE문에서 WHEN절에 NULL 지정하기
CASE a
WHEN 1 THEN '남자'
WHEN 2 THEN '여자'
WHEN NULL THEN '데이터 없음'
ELSE '미지정'
END
이 예제에서 조건식이 처리되는 순서는 아래와 같다.
그런데 문제는 비교 연산자 =로는 NULL값과 같은지 아니지를 비교할 수 없다는 것이다.
따라서 a열의 값이 NULL이라고 해도 a = NULL은 참이 되지 않는다.
즉, ‘데이터 없음’ 대신 ELSE절에 있는 ‘미지정’이라는 결과값이 나온다.
이때 NULL값인지 아닌지를 판정하기 위해서는 IS NULL을 사용한다.
다만, 단순 CASE문은 특성상 =연산자로 비교하는 만큼, NULL값인지를 판정하기 위해서는 검색 CASE문을 사용해야 한다.
검색 CASE문으로 NULL 지정하기
CASE
WHEN a = 1 THEN '남자'
WHEN a = 2 THEN '여자'
WHEN a IS NULL THEN '데이터 없음'
ELSE '미지정'
END
단순 CASE문으로는 NULL값을 비교할 수 없다!