일반함수
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");
'Oracle > SQL' 카테고리의 다른 글
SQL 단일행 함수 - 일반함수 ( case when ~ then~ else~end as ) 파생컬럼생성 (0) | 2021.11.19 |
---|---|
SQL 단일행 함수 - 일반함수 ( Decode ) (0) | 2021.11.19 |
SQL 단일행 함수 -변환함수 (to_number) , 암시적 형 변환 (0) | 2021.11.19 |
SQL 단일행 함수 -변환함수 (To_date) 날짜형으로 변환 (0) | 2021.11.19 |
SQL 단일행 함수 -변환함수 (To_char) 문자형으로 변환 (0) | 2021.11.19 |