CASE 문으로 데이터 변환하기

유석현(SeokHyun Yu)·2022년 8월 9일
0

SQL

목록 보기
15/45
post-thumbnail

서론

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가지를 간단히 알아보고 이번 챕터를 마무리 하겠다.

  • ELSE를 생략하면 'ELSE NULL'이 된다.

  • WHEN의 조건식에 NULL을 지정하고 싶을 때 'WHEN a=NULL'이 아니라 'WHERE a IS NULL'로 해줘야 한다.

profile
Backend Engineer

0개의 댓글