Study/DB

[SQL 첫걸음] 3장.정렬과 연산 - 15.CASE 문으로 데이터 변환하기

momo02 2018. 8. 30. 09:07
반응형

저자 : 아사이 아츠시

출판 : 한빛미디어



1. CASE문 
- NULL값을 0으로 간주하여 계산하고 싶은 경우 (원래 NULL값으로 연산한 결과는 모두 NULL) 사용자 정의 함수를 작성하지않고도 CASE문으로 처리 가능. 
- CASE문 : 

CASE WHEN 조건식1 THEN 식1

[ WHEN 조건식2 THEN 식2 ... ]

[ ELSE 식3 ]

END 

- WHEN 절에는 참과 거짓을 반환하는 조건식을 기술. 해당 조건을 만족하여 참이 되는 경우는 THEN절에 기술한 식이 처리됨. WHEN절의 조건식을 차례로 평가해나가다 가장 먼저 조건을 만족한 WHEN절과 대응하는 THEN절 식의 처리결과를 CASE문의 결괏값으로 반환.  
- 그 어떤 조건식도 만족하지 못한 경우엔 ELSE절에 기술한 식이 채택됨. ELSE는 생략 가능하며 생략했을 경우 'ELSE NULL'로 간주됨. 

ex ) 
SELECT a, CASE WHEN a IS NULL THEN 0 ELSE a END "a(null=0)" 

FROM sample37;  



COALESCE : NULL값을 변환하는 경우에는 COALESCE 함수를 사용하는 편이 더 간단. 
위 select명령 예제를 COALESCE 함수를 사용해 구현 
--> SELECT a, 
COALESCE(a,0) FROM sample37; 
(a가 NULL이 아니면 a값을 그대로 출력, 그렇지 않으면(a가 NULL이면) 0을 출력) 



2. 또 하나의 CASE 문 
- CASE문은 '검색 CASE'와 '단순 CASE'의 두 개 구문으로 나눌 수 있음.
검색 CASE는 '
CASE WHEN 조건식 THEN 식... ' 구문.
단순 CASE는 '
CASE 식 WHEN  식 THEN 식... ' 구문.
- 단순 CASE 식 :

CASE 식1

WHEN 식2 THEN 식3
[ WHEN 식4 THEN 식5 ... ]
[ ELSE 식6 ]
END

- 식1의 값이 WHEN 식2의 값과 동일한지 비교하고 같으면 식3이 CASE문 전체의 결괏값이 됨.
값이 같지않으면 그 뒤에 기술한 WHEN 절과 비교하는 식으로 진행.






3. CASE를 사용할 경우 주의사항
- CASE문은 SELECT 구 뿐만아니라 WHERE 구에서 조건식의 일부로 사용될 수도 있고 ORDER BY 구에서도 사용 가능. 
ELSE 생략하면 ELSE NULL이 됨. 즉 상정한 것 이외의 데이터가 왔을 때 NULL이 반환됨.
- 단순 CASE 문으로는 NULL값을 비교할 수 없음 : 단순 CASE에서는 WHEN 뒤에 1개의 상수값을 지정하는데  데이터가 NULL인 경우를 고려해 WHEN NULL THEN '데이터 없음'과 같이 지정하면 정상적으로 처리 X. 
--> 비교 연산자 = 로는 NULL값과 같은지 아닌지를 비교할 수 없음. NULL값인지 아닌지를 판정하기 위해서는 IS NULL 을 사용. 단순 CASE문은 특성상 = 연산자로 비교하는 만큼, NULL 값인지를 판정하려면 검색 CASE 문을 사용해야 함. 




- DECODE NVL : Oracle에는 이 같은 디코드를 수행하는 DECODE 함수가 내장되어 있음.
또한 NULL값을 변환하는 함수도 있는데 
Oracle에서는 NVL함수, SQL Server에서는 ISNULL 함수가 이에 해당. but 특정 데이터베이스에 국한된 함수인 만큼 NULL값을 변환할 때는 표준 SQL로 규정되어있는 COALESCE함수를 사용하는것이 좋음.

반응형