본문 바로가기

DEVELOPMENT/SQL

[SQL] CASE 문

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