티스토리 뷰


일반 함수



NVL() 함수

: NULL값을 만나면 다른 값으로 치환해서 출력하는 함수

--수수료율(commission_pct)가 있는 경우는 salary*commission_pct 하고 없는 경우 0으로 출력
SELECT first_name as "이름", commission_pct*salary as "수수료"
FROM EMPLOYEES;

--수수료 없으면(null이면) 0으로 대체
SELECT first_name as "이름", NVL(commission_pct*salary, 0) as "수수료"
FROM EMPLOYEES;

          


--부서 코드가 없으면 '99999' 출력, 있으면 그대로 부서 아이디 출력
SELECT first_name as "이름", NVL(DEPARTMENT_ID, 99999) as "부서 코드"
FROM EMPLOYEES;



NVL2() 함수

: NVL함수의 확장으로 NULL 값이 아닐 경우 출력할 값을 지정할 수 있음


DECODE() 함수

: 일반 개발 언어에서의 IF문과 같은 개념

1) decode(A, B, T)
if (A == B) { T }

2) decode(A, B, T, F) 
if (A == B) { T } else { F }

3) decode(A, B, 가, C, 나, D, 다, 라)
if (A == B) { 가 } else if (A == C) { 나 } else if (A == D) else { 라 }

4) decode(A, B, decode(C, D, 가, 나))
if (A == B) { if (C == D) { 가 } else { 나 } } else { null }
--부서 코드가 80번이면 '우리 부서' 출력 else NULL
SELECT FIRST_NAME as "이름", DEPARTMENT_ID as "부서 번호", DECODE(DEPARTMENT_ID, 80, '우리 부서') as "부서 코드"
FROM EMPLOYEES;



--부서 코드가 80번이면 '우리 부터', else '타 부서' ; DECODE
SELECT FIRST_NAME as "이름", DEPARTMENT_ID as "부서 번호",
DECODE(DEPARTMENT_ID, 80, '우리 부서', '타 부서') as "부서 소속"
FROM EMPLOYEES;



--부서 코드가 80번이면 '우리 부서', 90번이면 '경쟁 부서', 100번이면 '우수 부서' 출력 DECODE
SELECT FIRST_NAME as "이름", DEPARTMENT_ID as "부서 번호",
DECODE(DEPARTMENT_ID, 80, '우리 부서', 90, '경쟁 부서', 100, '우수 부서') as "부서 소속"
FROM EMPLOYEES;


--매니저 아이디가 145이고, 부서 코드가 80번일 때 '우리반 우수 직원'을 출력 ; DECODE
SELECT FIRST_NAME as "이름", MANAGER_ID as "매니저 아이디", DEPARTMENT_ID as "부서 코드",
DECODE(DEPARTMENT_ID, 80, DECODE(MANAGER_ID, 145, '우수 직원')) as "우수 직원 표시란"
FROM EMPLOYEES;




CASE 문

case 조건 when 결과1 then 처리 내용1
  when 결과2 then 처리 내용2
  when 결과2 then 처리 내용3
end "가상의 컬럼명"
--부서 코드가 80번이면 '우리 부서', 90번이면 '경쟁 부서', 100번이면 '우수 부서' 출력 : CASE
SELECT FIRST_NAME as "사원", 
CASE DEPARTMENT_ID WHEN 80 THEN '우리 부서' 
			WHEN 90 THEN '경쟁 부서' 
			WHEN 100 THEN '우수 부서' END "부서 현황"
FROM EMPLOYEES;


--급여가 5000 이하면 '저연봉 사원', 5000~10000 이면 '일반 사원', 10000 초과면 '고연봉 사원' 출력 : case
SELECT FIRST_NAME as "사원", SALARY as "연봉",
CASE WHEN SALARY<=5000 THEN '저연봉 사원' WHEN SALARY>5000 AND SALARY<10000 THEN '일반 사원' WHEN 10000<SALARY THEN '고연봉 사원' END "연봉별 등급"
FROM EMPLOYEES;



--근속 년수가 10년 이상이면 '근속 우수 사원' 15년 이상이면 '장기 근속 우수 사원' 을 출력 - CASE
 SELECT first_name as "사원", FLOOR((TO_CHAR(SYSDATE, 'rrrr') - TO_CHAR(HIRE_DATE, 'rrrr'))) as "근무 년수",
 CASE WHEN FLOOR((TO_CHAR(SYSDATE, 'rrrr') - TO_CHAR(HIRE_DATE, 'rrrr')))>=15 then '장기근속 우수 사원' 
 		  WHEN FLOOR((TO_CHAR(SYSDATE, 'rrrr') - TO_CHAR(HIRE_DATE, 'rrrr')))>=10 THEN '근속 우수 사원' end "근속 현황"
 FROM EMPLOYEES;


ver.2

 SELECT first_name as "사원", HIRE_DATE as "입사일",
 CASE WHEN MONTHS_BETWEEN(SYSDATE, HIRE_DATE)>=180 then '장기근속 우수 사원' 
 		  WHEN MONTHS_BETWEEN(SYSDATE, HIRE_DATE)>=120 THEN '근속 우수 사원' end "근속 현황"
 FROM EMPLOYEES;



'DBMS > Oracle 11g' 카테고리의 다른 글

5. JOIN in SQL  (0) 2017.09.28
5. SQL 복수행 함수(Multi-row function) 연습  (0) 2017.09.27
4. 단일행 함수(Single-Row Function) PART-2  (0) 2017.09.26
4. 단일행 함수(Single-Row Function) PART-1  (0) 2017.09.26
3. ORDER BY 절  (0) 2017.09.26
댓글