본문 바로가기
Study/SQL

7.NULL처리 함수

by 로롤로롱 2023. 4. 29.

/*
<NULL처리 함수>
1) NVL(컬럼, 컬럼값이 NULL이면 반환할 값)
    - 컬럼과 반환 값의 타입이 일치해야 함 -> 일치하지 않으면 수치 부적합 오류
** ORDER BY 절에 별칭 사용 가능
*/
-- NULL은 연산되지 않으므로 0으로 변경 후 연산
SELECT emp_name, NVL(commission_pct, 0) AS 보너스, ((salary+(salary*NVL(commission_pct, 0)))*12) AS 연봉 
FROM emp;

SELECT emp_name, NVL(TO_CHAR(DEPARTMENT_ID), '부서없음')
FROM emp;
/*
2) NVL2(컬럼, 변경할값1, 변경할값2)
    - 컬럼이 NULL이 아니면 변경할 값1을 반환, NULL이면 변경할값2를 반환
*/
-- 보너스를 출력하는데 보너스가 동결되었음->보너스를 받는사람들은 0.1 안받으면 0
SELECT emp_name, commission_pct AS 보너스, NVL2(commission_pct, 0.1, 0) AS 동결보너스 ,
    salary+salary*NVL2(commission_pct, 0.1, 0) AS 월급
FROM emp;

/*
참고) TO_TIMESTAMP
    - 시간 정교하게 (다시 정리)
*/
SELECT TO_TIMESTAMP(SYSDATE) FROM DUAL;

-- SELECT TO_CHAR(SYSDATE,'YYYY') -cust_year_of_birth+1
 SELECT EXTRACT(YEAR FROM SYSDATE)-cust_year_of_birth+1||'세' AS 나이,
 TRUNC(EXTRACT(YEAR FROM SYSDATE)-cust_year_of_birth+1,-1)||'대' AS 연령대
-- FLOOR(나이/10)*10
--   FLOOR((EXTRACT(YEAR FROM SYSDATE)-cust_year_of_birth+1)/10)*10||'대' AS 연령대
FROM customers
WHERE TRUNC(EXTRACT(YEAR FROM SYSDATE)-cust_year_of_birth+1,-1)=30
ORDER BY 나이;

--SELECT FLOOR(MONTHS_BETWEEN(SYSDATE, TO_DATE(cust_year_of_birth, 'YYYY'))/12)+1
SELECT MONTHS_BETWEEN(TRUNC(SYSDATE, 'MONTH'), TO_DATE(cust_year_of_birth, 'YYYY'))/12+1
FROM customers;

/*
3) NULLIF(비교대상1, 비교대상2)
    - 두개의 값이 동일하면 NULL 반환
    - 동일하지 않으면 비교대상1을 반환
*/

SELECT NULLIF('123','123') FROM DUAL;
SELECT NULLIF('123','111') FROM DUAL;

/*
실습문제
SELECT emp_name AS 이름, salary AS 급여, NVL(commission_pct,0) AS 보너스, TO_CHAR((salary+(salary*NVL(commission_pct,0)))*12, '999,999') AS 연봉
FROM emp
WHERE (salary+(salary*NVL(commission_pct,0)))*12 >=200000
ORDER BY salary DESC
;

SELECT TO_CHAR(SYSDATE, 'YYYY')-('20'||SUBSTR('1111294045862',1, 2)) FROM DUAL;
SELECT TO_CHAR(SYSDATE, 'YYYY')-('19'||SUBSTR('9511291045862',1, 2)) FROM DUAL;
*/

'Study > SQL' 카테고리의 다른 글

9.그룹함수  (0) 2023.05.01
8.선택함수  (0) 2023.04.30
6.형변환함수  (0) 2023.04.28
5.날짜함수  (0) 2023.04.27
4.숫자 함수  (0) 2023.04.26

댓글