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(deptno, 10, 5000, 20,3000, 0)
이름, 월급, 입사한 년도 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을 숫자형으로 변환시켜주면 데이터 정렬 가능해짐.