> # NULL 처리 함수
- 오라클의 모든 타입의 자료형의 Default 값은 NULL임
- NULL 값과 연산이 실행되면 모든 결과가 NULL 임
1) IS NULL, IS NOT NULL
expr IS (NOT) NULL
사용예) 사원테이블에서 80번 부서(영업부)에 속하지않고
영업실적코드(COMMISSION_PCT)가 NULL 이 아닌 사원을 조회하시오.
Alias는 사원번호, 사원명, 부서코드, 직무코드, 영업실적코드
SELECT EMPLOYEE_ID AS 사원번호,
EMP_NAME AS 사원명,
DEPARTMENT_ID AS 부서코드,
JOB_ID AS 직무코드,
COMMISSION_PCT AS 영업실적코드
FROM EMP
WHERE DEPARTMENT_ID IS NULL
AND COMMISSION_PCT IS NOT NULL;
2) NVL(col,val)
사용예) 상품테이블에서 색상(PROD_COLOR) 값이 NULL인 상품의 색상컬럼에 '색상정보없음'을 출력하시오.
Alias는 상품코드, 상품명, 색상정보
SELECT PROD_ID AS 상품코드,
PROD_NAME AS 상품명,
NVL(PROD_COLOR,'색상정보없음') AS 색상정보
FROM PROD;
사용예) 2005년 2월 모든제품별 매입현황을 조회하시오 --모든, 전부, 전체 라는 말 나오면 외부조인. ~~별하면 집계함수. Alias는 제품코드, 제품명, 매입수량합계, 매입금액합계
(ANSI OUTER JOIN)
SELECT B.PROD_ID AS 제품코드,
B.PROD_NAME AS 제품명,
NVL(SUM(A.BUY_QTY),0) AS 매입수량합계,
NVL(TO_CHAR(SUM(A.BUY_QTY*B.PROD_COST),'99,999,999')
,'매출없음')
AS 매입금액합계 --NVL안의 앞뒤내용 데이터타입 일치해야함~
FROM BUYPROD A
RIGHT OUTER JOIN PROD B ON(A.BUY_PROD=B.PROD_ID AND
A.BUY_DATE BETWEEN TO_DATE('20050201') AND
LAST_DAY(TO_DATE('20050201')))
GROUP BY B.PROD_ID, B.PROD_NAME
ORDER BY 1;
(2005년 2월 매입상품종류)
SELECT COUNT(DISTINCT BUY_PROD)
FROM BUYPROD
WHERE BUY_DATE BETWEEN TO_DATE('20050201') AND
LAST_DAY(TO_DATE('20050201'));
3) NVL2(col,val1,val2)
사용예) 상품테이블에서 상품의 크기(PROD_SIZE)가 NULL이면 '상품의 크기정보 없음'을 비고난에 출력하고
NULL이 아니면 상품의 할인 판매가를 비고난에 출력하시오
Alias는 상품코드, 상품명, 상품크기, 비고
SELECT PROD_ID AS 상품코드,
PROD_NAME AS 상품명,
NVL(PROD_SIZE,'크기없음') AS 상품크기,
NVL2(PROD_SIZE,TO_CHAR(PROD_SALE,'99,999,999'),
'상품의 크기정보없음') AS 비고
FROM PROD;
4) NULLIF(c1,c2)
** PROD테이블에서 분류코드 'P301'에 속한 상품의 할인판매가를 매입가로 조정하시오
UPDATE PROD
SET PROD_SALE=PROD_COST
WHERE PROD_LGU='P301';
사용예) 상품테이블에서 매입가격과 할인판매가가 비교하여 동일한 제품은 비고난에 '단종예정상품',
동일하지 않은 제품은 '정상상품'을 출력
Alias는 상품코드, 상품명, 매입가, 할인판매가, 비고
SELECT PROD_ID AS 상품코드,
PROD_NAME AS 상품명,
PROD_COST AS 매입가,
PROD_SALE AS 할인판매가,
NVL2(NULLIF(PROD_SALE, PROD_COST),'정상상품', '단종예정상품')
AS 비고
FROM PROD;