본문 바로가기

Oracle

NULL과 NULL을 처리하기 위한 NVL, NULLIF

> DB null 처리

null 값은 아직 정의되지 않은 값으로 0, 공백과 다른 것입니다. 0 숫자이고 공백은 하나의 문자입니다.

그러므로 null 값을 포함하는 연산의 결과는 무조건무조건 null입니다. 정의되지 않은 값을 연산할 순 없으니까요

select null + 2 from dual;

결과

> NVL(표현식1, 표현식2)

표현식1의 결과 값이 null이면 표현식2를 출력

select nvl(null, 1000) from dual;

결과

> 공집합의 NVL 활용

아래 쿼리는 대표적인 공집합을 발생시키는 쿼리입니다.

 select 1 from dual where 0=1;

결과

위와 같이 아무것도 나오지 않는 결과를 보여줍니다. 조건에 맞는 데이터가 한건도 없는 경우를 공집합이라고 하며 null 데이터와는 다르게 이해를 해야 합니다.

null과 다른 값이기 때문에  공집합에 nvl함수를 이용해도 소용이 없습니다. 이용한다고 해도 공집합이 그대로 출력됩니다. 

select nvl(1,9999) from dual where 1=0;

결과

그럼에도 공집합을 nvl 활용하여 변경하고 싶다면 집계 함수를 이용하여 변경하는 방법이 있습니다.

 다른 함수와 다르게 집계 함수와 스칼라 서브 쿼리의 경우는 인수의 결과 값이 공집합인 경우에도 null 출력하게 됩니다.

그러므로 아래 쿼리의 결과 값은 9999입니다.

select nvl(max(1), 9999) from dual where 1=0;

결과

nvl 함수를 사용해야 하는 경우집계 함수를 포함한 nvl 함수를 사용해야 하는 경우, nvl 함수를 포함한 집계 함수를 사용하지 않아야  경우까지  이해해서 nvl 함수를 정확히 사용하는 것이 필요합니다!

> NULLIF (표현식1, 표현식2) 

표현식1, 표현식2가 같다면 NULL, 같지 않으면 표현식1을 리턴

 select nullif(1,1) from dual;

결과

select nullif(1,0) from dual; 

 

결과

nullif 함수는 case 문장으로도 표현할  있는데 아래와 같이 변경하면 동일한 결과를 얻을 수 있습니다.

select case when 1 = 1 then null else 1 end nullif from dual;

결과