CASE 문
RDBMS에 준비된 함수를 사용해 데이터를 특정 형태로 변환하는 경우도 있지만, 임의의 조건에 따라 독자적으로 변환 처리를 지정해 데이터를 변환하고 싶은 경우도 있다. 이때 CASE 문을 이용할 수 있다.
*형식
CASE
WHEN 조건식1 THEN 식1
WHEN 조건식2 THEN 식2
ELSE 식3
END
*예시
-- CASE로 NULL 값을 0으로 변환하기
SELECT a,
CASE
WHEN a IS NULL THEN 0
ELSE a
END "a(null=0)" FROM sample1;
COALESCE
NULL 값을 변환하는 경우라면 COALESCE 함수를 사용하는 편이 더 간단하다.
SELECT a, COALESCE(a, 0) FROM sample1;
COALESCE 함수는 여러 개의 인수를 지정할 수 있다. 주어진 인수 가운데 NULL이 아닌 값에 대해서는 가장 먼저 지정된 인수의 값을 반환한다. 앞의 예시는 a가 NULL이 아니면 a값을 그대로 출력하고, 그렇지 않으면 0을 출력한다.
단순 CASE 문
CASE 문은 '검색 CASE'와 '단순 CASE'의 두개 구문으로 나눌 수 있다.
검색 CASE는 'CASE WHEN 조건식 THEN 식 ...' 구문이다.
단순 CASE는 'CASE 식 WHEN 식 THEN 식 ...' 구문이다.
*형식
CASE 식1
WHEN 식2 THEN 식3
WHEN 식4 THEN 식5
ELSE 식6
END
식1의 값이 WHEN의 식2의 값과 동일한지 비교하고, 값이 같다면 식3의 값이 CASE 문 전체의 결괏값이 된다. 값이 같지 않으면 그 뒤에 기술한 WHEN 절과 비교하는 식으로 진행된다. 비교 결과 일치하는 WHEN 절이 하나도 없는 경우에는 ELSE 절이 적용된다.
*검색 CASE와 단순 CASE 비교
-- 검색 CASE로 성별 코드를 남자, 여자로 변환하기
SELECT a AS "코드",
CASE
WHEN a = 1 THEN '남자'
WHEN a = 2 THEN '여자'
ELSE '미지정'
END AS "성별" FROM sample1;
-- 단순 CASE로 성별 코드를 남자, 여자로 변환하기
SELECT a AS "코드",
CASE a
WHEN 1 THEN '남자'
WHEN 2 THEN '여자'
ELSE '미지정'
END AS "성별" FROM sample1;
CASE 문 주의사항
1. ELSE 생략
ELSE를 생략하면 ELSE NULL이 되는 것에 주의해야 한다. 따라서 ELSE를 생략하지 않고 지정하는 편이 낫다.
2. WHEN에 NULL 지정하기
비교 연산자 = 로는 NULL 값과 같은지 아닌지를 비교할 수 없다.
따라서 NULL 값인지 아닌지를 판정하기 위해서는 IS NULL을 사용한다.
-- 검색 CASE 문으로 NULL 판정하기
CASE
WHEN a = 1 THEN '남자'
WHEN a = 2 THEN '여자'
WHEN a IS NULL THEN '데이터 없음'
ELSE '미지정'
END
3. DECODE NVL
Oracle에는 이 같은 디코드를 수행하는 DECODE 함수가 내장되어 있다.
DECODE 함수는 CASE 문과 같은 용도로 사용할 수 있다. 다만 Oracle에서만 지원하는 함수이므로 다른 데이터베이스 제품에서는 사용할 수 없다.
또한, NULL 값을 변환하는 함수도 있는데 Oracle에서는 NVL 함수, SQL Server에서는 ISNULL 함수가 이에 해당한다. 다만 이 함수들은 특정 데이터베이스에 국한된 함수인 만큼 NULL 값을 변환할 때는 표준 SQL로 규정되어 있는 COALESCE 함수를 사용한다.
'DEVELOPMENT > SQL' 카테고리의 다른 글
[SQL] GROUP BY (0) | 2023.05.30 |
---|---|
[SQL] 집계함수 (0) | 2023.05.30 |
[SQL] 날짜 연산 (0) | 2023.05.30 |
[SQL] 문자열 연산 (0) | 2023.05.30 |
[SQL] 결과 행 제한 (0) | 2023.05.30 |