데이터베이스 연구실.log

조건별 값 변환

값에 따라 다른 결과를 내는 DECODE와 CASE 식의 문법과 차이, 실습의 보너스, 등급 계산 예와 개인정보 가림 예

DECODECASE단순 CASE검색 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

SQL Developer 또는 SQL*Plus조회만 함
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

SQL Developer 또는 SQL*Plus조회만 함
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로 바꾸는 식임

SQL Developer 또는 SQL*Plus조회만 함
SELECT SUBSTR(ename, 1, 1) || 'O' || SUBSTR(ename, 3)
  FROM emp19;

결과 해석:

실습에서는 다섯 글자 이름을 추가로 넣고 이름 길이별로 결과를 보게 했음
길이에 따라 가리는 글자 수를 바꾸려면 CASE와 LENGTH를 함께 쓰는 방식이 될 것으로 보이나 수업 자료에 답은 없음

#사용 조건과 주의사항

DECODE는 Oracle 함수임
실습에서는 PostgreSQL에서 CASE를 쓰는 비교를 따로 다루지 않았음

SEO_HKabsumveritas@gmail.comBuilt with Claude Code & Codex

마지막 갱신 개인 학습 기록이며 운영 환경 적용 전 공식 문서 확인 필요

두 글자 이상 입력, 위아래 화살표로 이동하고 Enter로 열기