Oracle DBA/SQL

20230626 (2) SQL 034 : IF문을 SQL로 구현하기 1(DECODE)

Nuez 2023. 6. 26. 09:40
반응형

함수

1) 단일행 함수 : 문자, 숫자, 날짜, 변환, 일반
2) 복수행 함수 : max, min, sum,avg, count


이름, 부서번호, 보너스를 출력하는데, 보너스를 출력할 때 부서번호가 10번이면 5000을 출력하고, 부서번호가 20번이면 3000을 출력하고, 나머지 부서번호는 0을 출력하시오. 

SELECT ename, deptno, DECODE(deptno, 10, 5000, 20,3000, 0) AS 보너스
FROM emp;

 

DECODE : 코드 없이 if문을 구현하겠다. 

 

구조 :

DECODE(대상 컬럼명, 조건1, 조건1을 충족했을 때의 값, 조건2, 조건2를 충족했을 때의 값, 기본 값

DECODE(deptno10, 500020,30000)


이름, 월급, 입사한 년도 4자리, 보너스 출력하는데, 입사한 년도가 1981년도면 보너스를 9000으로 출력하고, 나머지 년도는 그냥 0으로 출력하시오. 

SELECT ename AS 이름, 
       sal  AS 월급, 
       hiredate AS 입사일,
       to_char(hiredate,'RRRR') AS 입사년도, 
       DECODE(to_char(hiredate,'RRRR'),1981,9000,0) AS 보너스
FROM emp;


문제 137. 이름, 보너스를 출력하는데, 이름의 첫번째 철자가 S이면 보너스를 5000을 출력하고, A이면 3000을 출력하고, 나머지 사원들은 0을 출력하시오. 

SELECT ename, DECODE(substr(ename,1,1), 'S', 5000, 'A', 3000, 0) AS 보너스
FROM emp;


DECODE 관련 이슈 (문제 138 ~ 141)

: 암시적 형 변환 사례 (Oracle bug)


문제 138. 이름과 직업과 월급을 출력하는데, 월급이 높은 사원부터 출력하시오. 

SELECT ename, JOB, sal
FROM emp
ORDER BY 3 DESC;


문제 139. 이름과 보너스를 출력하는데 보너스가 직업이 president면 null로 출력하고, 나머지 사원들은 자기 자신의 월급이 보너스로 출력되게 하시오. 

SELECT ename, DECODE(JOB, 'PRESIDENT', NULL, sal) AS 보너스
FROM emp;

 

문제 140. 위의 결과를 다시 출력하는데, 보너스가 높은 사원부터 출력하시오. 

SELECT ename, DECODE(JOB, 'PRESIDENT', NULL, sal) AS 보너스
FROM emp
ORDER BY 보너스 DESC;

오류 (정렬되지 않음) 

 

* DECODE(JOB, 'PRESIDENT', NULL, sal)

: 세번째 인자 값의 데이터 유형에 의해서, 네번째 인자 값의 데이터 유형이 결정됨. 

NULL = 문자형 

∴ sal도 문자형으로 출력되느라 오류가 발생

 

문제 141. (SQLP 시험) 위의 결과가 제대로 나오게 SQL을 튜닝하시오. 

SELECT  ename, DECODE(JOB, 'PRESIDENT', TO_NUMBER(NULL), sal) AS 보너스
FROM emp
ORDER BY 보너스 DESC;

 

 NULL을 숫자형으로 변환시켜주면 데이터 정렬 가능해짐.