조건별 값 변환
값에 따라 다른 결과를 내는 DECODE와 CASE 식의 문법과 차이, 실습의 보너스, 등급 계산 예와 개인정보 가림 예
#핵심 요약
DECODE(컬럼, 값1, 결과1, 값2, 결과2, 기본값)은 if와 elif 같은 코드 없이 조건 분기를 구현함
DECODE는 같은지(등호)만 비교하므로, >= 같은 부등호 조건은 CASE를 씀
CASE WHEN 조건 THEN 값... ELSE 값 END는 조건마다 결과를 정하고, CASE 컬럼 WHEN 값 THEN...는 값이 같은지로 분기함
NULL 비교는 둘이 다름DECODE는 두 NULL을 같다고 보지만 일반 비교에서 NULL은 어떤 값과도 같지 않음
#개념과 동작 원리
| 구분 | 형태 | 비교 방식 |
|---|---|---|
DECODE |
DECODE(deptno, 10, 300, 20, 400, 0) |
같은 값인지 |
단순 CASE |
CASE deptno WHEN 10 THEN 5000 WHEN 20 THEN 3000 ELSE 0 END |
같은 값인지 |
검색 CASE |
CASE WHEN sal >= 3000 THEN 500 ... ELSE 0 END |
임의의 조건 |
검색 CASE는 위에서부터 처음 참이 되는 WHEN의 결과를 씀
실습 예에서 월급 3500은 첫 조건(>= 3000)에서 500이 되고 아래 조건은 보지 않음
그래서 큰 기준부터 적었음
"Oracle considers two nulls to be equal when evaluating a DECODE function."
#필수 명령어 또는 SQL
#DECODE
SELECT ename, deptno, DECODE(deptno, 10, 300,
20, 400, 0) AS bonus
FROM emp;
SELECT ename, sal, job, DECODE(job, 'SALESMAN', 5000,
'ANALYST', 4000, 0) AS bonus
FROM emp;결과 해석: 부서 10은 300, 20은 400, 나머지는 0임
마지막 인수를 생략하면 어느 값과도 맞지 않을 때 NULL이 됨
#CASE
SELECT ename, job, sal, CASE WHEN sal >= 3000 THEN 500
WHEN sal >= 2000 THEN 300
WHEN sal >= 1000 THEN 200
ELSE 0 END AS 보너스
FROM emp
WHERE job IN ('SALESMAN', 'ANALYST');
SELECT ename, deptno, CASE deptno WHEN 10 THEN 5000
WHEN 20 THEN 3000
ELSE 0 END AS 보너스
FROM emp;
SELECT ename, deptno, CASE WHEN deptno = 10 THEN 5000
WHEN deptno = 20 THEN 3000
ELSE 0 END AS 보너스
FROM emp;결과 해석:
연습 문제(답 확인 불가): emp19에서 나이 30 이상 A, 28 이상 B, 25 이상 C, 나머지 D 등급 매기기
통신사가 sk면 600, kt면 500, 나머지는 400 보너스 주기emp19의 통신사 값에는 SKT, skt, sk, KT, kt가 섞여 있어, 대소문자와 표기를 맞추지 않으면 원하는 결과가 나오지 않음
실습에서는 다른 실습에서 UPDATE로 sk를 SKT로 고치고 LOWER(telecom)으로 묶었음
#이름 가리기
실습에서는 병원 전광판에 환자 이름을 개인정보 보호에 맞게 출력하는 과제를 냈음
힌트는 두 번째 글자를 O로 바꾸는 식임
SELECT SUBSTR(ename, 1, 1) || 'O' || SUBSTR(ename, 3)
FROM emp19;결과 해석:
실습에서는 다섯 글자 이름을 추가로 넣고 이름 길이별로 결과를 보게 했음
길이에 따라 가리는 글자 수를 바꾸려면 CASE와 LENGTH를 함께 쓰는 방식이 될 것으로 보이나 수업 자료에 답은 없음
#사용 조건과 주의사항
DECODE는 Oracle 함수임
실습에서는 PostgreSQL에서 CASE를 쓰는 비교를 따로 다루지 않았음