본문 바로가기

Oracle/SQL

SQL 단일행 함수 - 일반함수 (NULL 을 처리하는 NVL, NVL2)

일반함수

NVL, NVL2 (null 값 대신 다른 데이터 출력 하기)

  • 결측치를 다른값으로 치환하는 함수 (머신러닝 할때 굉장히 중요한 함수 중 하나)
  • null 은 어떤것과 더하더라도 출력 되는 값은 null 이 되기때문에 꼭 null은 다른값으로 치환해 주어야
  • 계산이 원활하게 이루어 진다.

예제 : 커미션값이 null 인 사람들의 이름과, 월급과 커미션 출력

select ename, sal, comm
from emp
where comm is null;

설명 : 만약 데이터가 많다면 , 이게 일부러 null 값인지, 실수로 넣지 않은건지 헷갈릴 수 있기 때문에,

null 값을 0으로 치환해 주는 과정을 하는것이 좋다.

예제 : 이름과, 커미션 출력 하는데 커미션이 null 인 사원들은 0으로 치환하여 출력

select ename, nvl(comm, 0 )
from emp;

설명 : 그냥 0으로 출력하는거지 데이터 자체가 0으로 바뀐것은 아니다.

함수 : nvl(comm, 치환하고 싶은 값또는 '문자,날짜')

 

문제 : 이름, 월급, 커미션, 월급+커미션 을 출력

select ename, sal, comm, sal + nvl(comm,0)
from emp;

설명 : sal + comm 으로 출력 하려고 하면 출력 되지 않는다.

null 값의 정의가 2가지 인데 데이터가 없는 상태 또는 알 수 없는값 (unknown)입니다.

-> 알 수 있는 값 + 알수없는 값 = 알수없는값 

그래서 제대로 계산 하기 위해 null 값을 0으로 바꾸어 준다.

문제 : 이름, 커미션 출력 커미션이 null 인 사원들은 no comm 이라는 글씨로 출력 되게 하시오

select ename, nvl(to_char(comm), 'no comm' )
from emp;

설명 : 커미션을 no comm으로 치환하여 출력하려면

nvl (comm, 'no comm' )으로 썼는데,

    숫자    ,   문자.  형식이 맞지 않기 때문에 

nvl (to_char(comm), 'no comm')

         문자.              ,    문자         변환하여 데이터를 출력해 준다. 

→nvl (컬럼명, null 대신 대체해서 출력 할 값)

문제 : 이름, 관리자 번호를 출력 하는데 관리자 번호가 null 인 사원들은 no manager 로 출력

select ename, nvl(to_char(mgr), 'no manager')
from emp;

설명 : mgr 또한 숫자이기 때문에 문자 형으로 바꾸어 주어야 한다.

문제 : 부서번호가 20, 30 인 사원들의 이름과 커미션을 출력하는데 커미션이 높은 사원부터 출력

select ename, nvl(comm,0)
from emp
where deptno in (20,30)
order by 2 desc;

—> null 값을 0으로 치환하지 않은 채 order by절로 desc 하게 되면 오라클에서는 null 값이 자동으로 제일 위로 올라오게 된다.

이것을 해결하려면

—> desc 뒤에 nulls last or nulls first 라고 입력하면

Null 값이 맨 뒤로 빠지거나, 맨 앞으로 이동시킬 수 있다.


NVL2 

예제 : null 이 아닌 사원들은 sal + comm 출력하고, null 인 사원들은 sal 만 출력 단 직업이(analyst, manager)

select ename, sal, comm, nvl2(comm, sal+comm, sal)
from emp
where job in ('ANALYST', 'MANAGER");