SELECT NVL(null, '') FROM DUAL => null ??? 0 2 7,142

by 박진규 [Oracle 기초] null nvl empty blank whitespace [2011.07.01 14:58:12]


NVL(expr1, expr2) 함수는 expr1이 null 이면 expr2을 반환하는 함수죠.

그리고 null 과 empty string(a.k.a. white space, blank)는 다르다고 알고 있죠.

그래서 a, b 필드를 비교할때 null 이 나와서 원하는대로 비교되지 않을 경우를 대비해

다음과 같이 쿼리를 짰습니다.(오라클10g 입니다.)

  • SELECT * FROM T1 WHERE NVL(a, '') <> NVL(b, '')

그런데 결과가 원하는대로 안나오는 겁니다. 이상타 싶어 NVL 을 다시 테스트 해봤죠. 아래 처럼요.

  • SELECT NVL(null, '') FROM DUAL

그랬더니 떡하니 나오는 결과

 NVL(NULL,'')    
 --------------- 
 (null)          

아~~~~ 이게 뭔지~~~@#$%

오라클은 '' (작은따옴표 두개)를 null 로 인식하는 것이었습니다!

제발 by design 이라고 말씀해주세요ㅠ_ㅠ

by 知音 [2011.07.01 15:11:39]
with t as (
select '1' a, null b from dual union all
select '1' a, '1' b from dual union all
select '1' a, '2' b from dual union all
select '' a, null b from dual union all
select '' a, '1' b from dual union all
select null a, null b from dual
)
select a, b
from t
where nvl(a, 'x') <> nvl(b, 'x')

이걸 원하시는 거 아닌지요..

nvl(a, 'x'), nvl(b, 'x') 에서 x 는 무의한 문자 값입니다.

참고로, oracle은 null 과 '' 모두 null 로 인식합니다.

by 박진규 [2011.07.01 15:47:20]
네네, 맞습니다. 오라클이 null 과 '' 을 모두 null 로 인식한다는 사실 그자체를 몰랐어요! 답변 감사합니다~
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입