본문 바로가기

DataBase/Oracle

Oracle/PLSQL NVL 함수

매개변수

 - NVL(string1, replace_with)

  - string1 : null인지 아닌지 판단할 문자열

  - replace_with : string1이 null이라면 대체할 문자열

 

반환

  - string1이 null이 아니면 string1값을 반환, null이면 replace_with을 반환

 

사용 예제

--이벤트 사용 여부(USE_YN)가 null이면 N으로 조회

SELECT NVL(USE_YN, 'N') 

 FROM EVNT_MST

 

--가장 나중에 업데이트 날짜(UPD_DE), 등록된 날짜(RES_DE)로 정렬

SELECT *

 FROM EVNT_MST

ORDER BY NVL(UPD_DE, SYSDATE - 9999), RGS_DE DESC 

 

--EVNT_NM컬럼이 null이면 EVNT_NM_SHRTEN컬럼 값 조회

SELECT NVL(EVNT_NM, EVNT_NM_SHRTEN)

 FROM EVNT_MST

 

--EVNT_AMT컬럼이 null이면 0, 아니면 해당 값 조회

SELECT NVL(EVNT_AMT, 0) EVNT_AMT

 FROM EVNT_MST

 

사용시 주의사항

NVL만 믿고 코드를 짰을 경우, string1에 공백 문자(' ')가 들어있으면 해당 값은 null이 아니므로 NVL함수에 걸리지 않는다.

얼마전에 같이 일하던 개발자가 입장권 유효 날짜에 프로그램 사용자가 데이터를 넣지 않고 INSERT를 한 경우, 경고창을 띄우는것이 아니라 해당 컬럼에 공백 문자를 입력하도록 프로그램을 수정했다. 수정한 다음날 현업에서 전화가 쏟아졌다. 그 이유는 where절에 날짜 컬럼이 비어있으면 오늘 날짜로 조회(nvl 함수를 이용)하고, 오늘 날짜와 비교하여 사용 기간이 지났으면 해당 입장권을 사용할 수 없도록 프로그램이 짜여있었기 때문이었다. 그래서 날짜 지정이 따로 안되어있던(공백 문자가 들어가 있던) 입장권들은 시스템 상 사용할 수 없는 입장권이 되어버렸다. 고객들은 이미 온라인에서 입장권을 구매하고 왔는데, 사용하지도 않은 입장권이 사용 불가 상태니 현업에선 IT팀으로 전화하는 수밖에.. 일단 고객들은 무료 입장을 시키고 (입장권이 조회는 가능하니..) 후에 오류를 찾아 프로그램은 수정해서 재배포 하고 미사용 입장권은 사용처리를 하고 무료 입장권은 VOID(반품) 처리하느라 야근했다.. 공백 문자 하나 때문에 정말 애를 먹었다.. ㅎㅎ (컬럽값이 비어있으면 오늘 날짜로 조회를 하는데 왜 오늘 날짜로 조회를 안하지 하고 한참 고민하다가 공백 문자가 있다는걸 발견했을땐 정말 허탈했다..!)

 

 

참고

 https://www.techonthenet.com/oracle/functions/nvl.php

'DataBase > Oracle' 카테고리의 다른 글

Oracle/PLSQL NVL2 함수  (0) 2019.05.09
ORA-00911:문자가 부적합 합니다. 오류  (0) 2018.12.31