본문 바로가기
IT/Oracle

오라클 LNNVL함수 / nullable 컬럼에 부정 조건을 사용해야하는 경우

by heavenLake 2022. 7. 22.
반응형

 

출처 : https://gent.tistory.com/387

 

조건문은 긍정문으로 작성하는게 국룰이지만 가끔은 부정문을 써야할때도 있다. 

그런데 문제는 해당 컬럼이 Nullable일때 그냥   

where col != '값'

이렇게 해버리면 col의 값이 null이 row는 검색이 안된다.

굉장히 자주 일어날수 있는 오류다.

이걸 해결하려면 nvl로 col을 치환하거나, or문으로 is null까지 비교해야하는데.

오라클에서는 이걸 해결하기 위해 존재하는 함수가 LNNVL이다.

 

 

오라클에서 LNNVL 함수는 간단한 함수 같지만, 함수의 기능을 제대로 이해하지 않으면 아주 복잡하게 느껴지는 함수이다. LNNVL 함수는 해당 컬럼에 NULL이 존재할 경우 NULL 처리와 조건문을 한 번에 연산하기 위해서 사용한다.

 

LNNVL 함수는 아래의 상황일 때 조건이 TRUE이다.

 

  • 컬럼이 NULL인 경우 = TRUE
  • 함수 내부 조건이 FALSE인 경우 = 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은 잘못된 결과를 출력한다.

반응형

댓글