출처 : https://gent.tistory.com/387
조건문은 긍정문으로 작성하는게 국룰이지만 가끔은 부정문을 써야할때도 있다.
그런데 문제는 해당 컬럼이 Nullable일때 그냥
where col != '값'
이렇게 해버리면 col의 값이 null이 row는 검색이 안된다.
굉장히 자주 일어날수 있는 오류다.
이걸 해결하려면 nvl로 col을 치환하거나, or문으로 is null까지 비교해야하는데.
오라클에서는 이걸 해결하기 위해 존재하는 함수가 LNNVL이다.
오라클에서 LNNVL 함수는 간단한 함수 같지만, 함수의 기능을 제대로 이해하지 않으면 아주 복잡하게 느껴지는 함수이다. LNNVL 함수는 해당 컬럼에 NULL이 존재할 경우 NULL 처리와 조건문을 한 번에 연산하기 위해서 사용한다.
LNNVL 함수는 아래의 상황일 때 조건이 TRUE이다.
|
한마디로 컬럼이 Nullable이고 부정문을 쓸때 사용하면된다.
오라클의 NULL 처리를 정확히 이해하고 있지 않으면 아래를 먼저 읽어보기 바란다.
[Oracle] 오라클 NULL 사용시 주의사항 정리 |
사용 예시 - 1
SELECT ename
, job
, comm
FROM emp
WHERE deptno = 30
AND LNNVL(comm = 0)
LNNVL(comm = 0)
- comm is null
- comm != 0
위의 2가지 조건을 한 번에 조건문을 선언한 것과 동일하다.
SELECT ename
, job
, comm
FROM emp
WHERE deptno = 30
AND (comm is null OR comm != 0)
LNNVL(comm = 0)과 동일한 결과가 조회되는 것을 확인할 수 있다.
LNNVL 함수를 사용하는 이유는 해당 컬럼에 NULL이 존재할 경우 해당 NULL 데이터도 함께 조회되도록 하기 위해서이다.
LNNVL 함수 내부의 조건은 조회하려고 하는 조건의 반대 조건으로 부여하는 것을 기억해야 한다.
사용 예시 - 2
SELECT ename
, job
, comm
FROM emp
WHERE deptno = 30
AND LNNVL(comm > 300)
LNNVL(comm > 300)
- 커미션(comm)이 300 이하의 직원을 조회하는 쿼리이다.
아래의 조건과 동일한 결과이다.
- comm is null OR comm <= 300
- NVL(comm, 0) <= 300
SELECT ename
, job
, comm
FROM emp
WHERE deptno = 30
AND NVL(comm, 0) <= 300
LNNVL(comm > 300) 조건과 NVL(comm, 0) <= 300 조건이 항상 동일한 결과라고 생각하면 안 된다. 위의 경우는 NULL이 300 이하라고 판단한 경우만 동일한 결과가 출력된다.
만약 comm이 300 이상인 직원과 comm이 NULL인 직원을 동시에 조회한다면 LNNVL(comm < 300) 이렇게 조건을 부여할 수 있으며, NVL(comm, 0) >= 300은 잘못된 결과를 출력한다.
'IT > Oracle' 카테고리의 다른 글
오라클 조인 방식 종류와 이해. (0) | 2022.07.22 |
---|---|
NULL 처리 시 유의 사항 및 항상 헷갈리는 내용 총정리 (0) | 2022.07.22 |
대용량 insert (0) | 2022.07.06 |
오라클 페이징 쿼리. (0) | 2022.02.18 |
엑셀 import Valid 체크 및 MyBatis 다중 루프 시 변수 처리 (0) | 2021.02.04 |
댓글