본문 바로가기
스터디/Oracle

[Oracle] NVL, NVL2, NULLIF, DECODE, COALESCE, CASE WHEN

by 홍장 2023. 6. 20.
NVL(칼럼, 변환 수) - NULL을 다른값으로 치환
select ename, sal, comm, NVL(comm, 1) , sal + NVL(comm, 0) from emp;

NVL2(칼럼, 변환 값1, 변환 값2)

칼럼이 NULL이 아닌 경우에는 변환값1, NULL인 경우 변환값2

변환값1, 변환값 2는 데이터 입이 동일해야 함

select ename, comm, NVL2(comm, comm+700, 100) from emp;

 

 

select 
	player_name,
	nation, 
	NVL2(nation, nation, '한국'), 
	NVL2(nation, nation||'인', '한국인') 
from player;

 

 

NULLIF(칼럼, 비교 값) - 비교 값 또는, NULL 반환

칼럼 값 == 비교 값 이면 NULL, != 이면 찾는 값는 반환

단, expr1에 NULL을 지정할 수 없음 

SELECT
    ename,
    job,
    NULLIF(job, 'SALESMAN') AS result
FROM
    emp
WHERE
    deptno = 30;

COALESCE(칼럼1, 칼럼2, ...., 반환 값)

나열된 칼럼을 순차적으로 체크하여 NULL이 아닌 첫번째 인수를 반환

모든 인수가 NULL인 경우 마지막 반환 값이 입력

SELECT
    ename,
    comm,
    sal,
    COALESCE(comm, sal, 50) result
FROM
    emp;

DECODE(칼럼, IF1, THEN1, IF2, THEN2, ... Default )

칼럼값이 IF1 일경우 THEN1 값, IF2인 경우 THEN2

일치하는 것을 발견하지 못한 경우 마지막 default 값, 

Default 가 생략되면 NULL 반환

예제 1)

select ename, sal, DECODE(sal, 3000, 'A', 5000, 'S', '탈락') from emp;

예제 2)

SELECT
    empno,
    ename,
    sal,
    job,
    decode(job, 'clerk', sal * 1.2, 'MANAGER', sal * 1.3,
           'SALESMAN', sal * 1.5, sal) result
FROM
    emp;

예제 1)

예제 3)

SELECT
    CUSTOMER_CD,
    CUSTOMER_ENG_NM,
    ITEM_LIST,
    SUBSTR(
        DECODE(INSTR(ITEM_LIST,'S01'),0,'',',의류/잡화') ||
        DECODE(INSTR(ITEM_LIST,'S02'),0,'',',뷰티') ||
        DECODE(INSTR(ITEM_LIST,'S03'),0,'',',레저/자동차') ||
        DECODE(INSTR(ITEM_LIST,'S04'),0,'',',식품') ||
        DECODE(INSTR(ITEM_LIST,'S05'),0,'',',생활/건강') ||
        DECODE(INSTR(ITEM_LIST,'S06'),0,'',',가구/인테리어') ||
        DECODE(INSTR(ITEM_LIST,'S07'),0,'',',가전') ||
        DECODE(INSTR(ITEM_LIST,'S08'),0,'',',도서/취미') ||
        DECODE(INSTR(ITEM_LIST,'S09'),0,'',',컴퓨터') ||
        DECODE(INSTR(ITEM_LIST,'S10'),0,'',',브랜드'),2)
    AS 관심품목명
FROM
    TB_ETC_INFO;

SUBSTR(문자열, 시작위치[, 길이]) 길이 생략시 끝까지 표현

시작위치 2를 선언하여 공통으로 들어가는 ',' 뒤인 2번째 자리부터 시작하여 끝까지 

 

예제3) 성별 구분하기

select
    student_name,
    student_ssn,
    substr(student_ssn, 8, 1) substr_rst,
    decode(substr(student_ssn, 8, 1),'1','남자','2','여자','모름') SEX
from tb_student;

 

 

 

 

 

CASE WHEN 

CASE

         WHEN  조건1 THEN '값1'

         WHEN  조건2 THEN '값2'

         WHEN  조건3 THEN '값3'

         ...

         ELSE '값'

END

SELECT
    ename,
    sal,
    CASE
        WHEN sal < 3000    THEN	'A팀'
        WHEN sal >= 5000   THEN	'S팀'
        ELSE '탈락'
    END AS gubun
FROM
    emp;

SELECT
    ENAME,
    SAL,
    CASE
        WHEN ENAME LIKE 'A%' THEN 'A팀'
        WHEN ENAME LIKE 'M%' THEN 'M팀'
        ELSE '기타'
    END AS GUBUN
FROM
    EMP;

select 
    student_no,
    point,
        case when point >= 4.0 then 'A'
            when point >= 4.0 then 'B'
            when point >= 4.0 then 'C'
            else 'F'
        end as 학점
from tb_grade