본문 바로가기

데이터베이스/ORACLE

17. NULL처리 함수

1. NULL 처리 함수

  • 테이블에 저장된 데이터 중 NULL 자료 값은 연산 시 오류를 유발
  • NVL, NVL2, NULLIF, IS NULL(IS NOT NULL) 등으로 NULL값을 처리
    = NULL 하면 처리 못한다. IS NULL 로서 해줘야 한다.

1) NVL(expr1, expr2)

  • 'expr1'의 값이 NULL 이면 'expr2'를 반환하고 'expr1'의 값이 NULL 이 아니면 자기 자신의 값 ('expr1')을 반환
  • 'expr1'과 'expr2'는 같은 데이터 타입이어야 함

예제) 사원 테이블에서 사원들의 보너스를 계산하여 조회하시오
       단, 80번과 50번 부서에 속한 사원만 조회하시오
       보너스 = 본봉 * 영업실적(COMMISSION_PCT)의 30%이다.
       ( Alias은 사원번호, 사원명, 급여, 보너스 )

SELECT EMPLOYEE_ID AS 사원번호,
       EMP_NAME AS 사원명,
       SALARY AS 급여,
       NVL(SALARY * COMMISSION_PCT*0.3, 0) * 0.3 AS 보너스,
       SALARY + NVL(SALARY * COMMISSION_PCT*0.3, 0) AS 지급액
  FROM EMPLOYEES
 WHERE DEPARTMENT_ID = 80
    OR DEPARTMENT_ID = 50;
   
    -- NVL(SALARY * COMMISSION_PCT*0.3, '없음') * 0.3 AS 보너스 -- 오류난다
    -- 변수가 모두 같은 타입이여야 한다.
    -- NVL(TO_CHAR(SALARY * COMMISSION_PCT*0.3), '없음') * 0.3 AS 보너스,
    -- 타입을 맞춰주면 성립한다.

 

예제) 장바구니 테이블(CART)에서 2005년 6월 판매정보를 이용하여 모든 제품별 판매현황을 조회하시오
        ( Alias는 상품코드, 상품명, 판매수량 합계, 판매금액 합계 )

-- 모든 -> OUTER JOIN -- 제품별 --> GROUP BY
-- 기본이되는 테이블에 어떤자료가 들어있는지 먼저 파악한다.
-- CART_NO 는 2005년 6월에 판매된이라는 조건에 사용될것이다
-- CART_PROD 상품코드
-- CART_QTY 수량합계
-- 상품명과 판매금액합계는 CART테이블에 존재하지않는 것들이다.
-- PROD 테이블가보면 PROD_NAME이 있고 PROD_PRICE가 있다. 
-- 두개의 테이블이 사용되어질것이다 공통되어진 컬럼이 있어야 조인이 발생
-- PROD_ID와 CART_PROD 가 같다
-- PROD 테이블에는 모든 상품에 대한 정보가 들어있으니 찾아서 상품명과 판매금액을 찾아낸다.
-- 모든상품에 대해서 --> 외부조인
   
SELECT B.PROD_ID AS 상품코드,
       B.PROD_NAME AS 상품명,
       NVL(SUM(A.CART_QTY), 0) AS 판매수량합계,
       NVL(SUM(A.CART_QTY*B.PROD_PRICE), 0) AS 판매금액합계  
  FROM CART A 
 RIGHT OUTER JOIN PROD B ON(A.CART_PROD=B.PROD_ID
   AND A.CART_NO LIKE '200506%')
 GROUP BY B.PROD_ID, B.PROD_NAME
 ORDER BY 1;

 

2) NVL2(expr1, expr2, expr3)

  • 'expr1'이 NULL이면 'expr3'을 반환하고, NULL이 아니면 'expr2'를 반환한다.
  • 'expr2'와 'expr3'는 같은 데이터 타입 이어야 함

예제) 사원 테이블에서 사원들의 보너스를 계산하여 조회하시오
       단, 80번과 50번 부서에 속한 사원만 조회하시오 (NVL2 사용)
       보너스 = 본봉 * 영업실적(COMMISSION_PCT)의 30%이다.
       ( Alias은 사원번호, 사원명, 급여, 보너스, 지급액 )

SELECT EMPLOYEE_ID AS 사원번호,
       EMP_NAME AS 사원명,
       SALARY AS 급여,
       NVL2(SALARY * COMMISSION_PCT*0.3, SALARY * COMMISSION_PCT*0.3, 0) * 0.3 AS 보너스,
       SALARY + NVL2(SALARY * COMMISSION_PCT*0.3, SALARY * COMMISSION_PCT*0.3, 0) AS 지급액
  FROM EMPLOYEES
 WHERE DEPARTMENT_ID = 80
    OR DEPARTMENT_ID = 50;

 

예제) 회원 테이블에서 마일리지가 1000미만인 회원들의 마일리지를 NULL로 갱신하라

UPDATE MEMBER
   SET MEM_MILEAGE = NULL
 WHERE MEM_MILEAGE < 1000;

 

문제) 회원테이블에서 마일리지가 NULL인 회원의 회원번호, 회원명, 이메일 주소를 조회하시오

SELECT MEM_ID AS 회원번호,
       MEM_NAME AS 회원명,
       MEM_MAIL AS 이메일주소
  FROM MEMBER
 WHERE MEM_MILEAGE IS NULL;   -- NULL 인지 아닌지 비교할때 IS 사용

 

예제) 회원들의 마일리지를 조회하여 그 값이 NULL이면 '비활동 회원',
        NULL이 아니면 '정상 회원'이라는 메시지를 비 고난에 출력하시오
        ( Alias는 회원번호, 회원명, 마일리지, 비고 )

SELECT MEM_ID AS 회원번호,
       MEM_NAME AS 회원명,
       NVL(MEM_MILEAGE, 0) AS 마일리지,
       NVL2(MEM_MILEAGE, '정상회원', '비활동회원') AS 비고
  FROM MEMBER ;

 

3) NULLIF(c1, c2)

  • c1과 c2를 비교하여 그 값이 같으면 NULL 반환하고 다르면 c1값을 반환

예제) 상품 테이블에서 분류번호 'P301'에 속한 자료의 PROD_SALE 값을 PROD_PRICE값으로 변경하시오

UPDATE PROD
   SET PROD_SALE = PROD_PRICE
 WHERE UPPER(PROD_LGU) = 'P301';  -- 좀 더 안정적 이도록 UPPER 사용

 

예제) 상품테이블에서 판매가와 할인가가 동일한(할인되지 않는 상품) 상품을 조회하시오
       ( Alias는 상품번호, 상품명, 판매가, 할인가 )

SELECT PROD_ID AS 상품번호,
       PROD_NAME AS 상품명,
       PROD_PRICE AS 판매가,
       PROD_SALE AS 할인가
  FROM PROD
 WHERE NULLIF(PROD_PRICE, PROD_SALE) IS NULL ;

 

1._null_function.sql
0.00MB

 

 

'데이터베이스 > ORACLE' 카테고리의 다른 글

19. ROLLUP / CUBE  (0) 2021.03.16
18. 집계 함수 / RANK 함수  (0) 2021.03.16
16. 변환 함수 ( CONVERSION FUNCTION )  (0) 2021.03.16
15. 날짜 함수 ( DATE_FUNCTION )  (0) 2021.03.16
14. 숫자형 함수 ( MATH_FUNCTION )  (0) 2021.03.16