NVL에 DATE형식이 들어갈때 조회조건 차이 0 1 5,165

by 제일 NVL [2014.03.03 17:18:09]


안녕하세요.

여러 자료로 도움만 받고 있는 회원입니다.
다름이 아니라 이번에 INSERT SELECT를 하면서 문제가 되는 부분이 있어서
내용을 찾아보려 했는데 찾기가 힘들어 이렇게 글을 쓰게 되었습니다.

아래 쿼리를 최대한 다듬는다고 다듬었는데도 모양새가 이렇네요.

내용의 요지는 이렇습니다. 제가 알기로는 이론상
A테이블에서 하나의 DATE타입을 기준으로 BETWEEN을 걸때 시작값에 NVL을 걸어주었습니다.
그런데 이게 왠걸? 이런식으로 조회를 하면 2140건 가량의 데이터만 조회가 됩니다.


select count(1)     
  FROM  A        
     ,  Z        
 WHERE Z.DSCHDATE BETWEEN TO_DATE('20140101000000','YYYYMMDDHH24MISS') AND TO_DATE('20140131235959','YYYYMMDDHH24MISS')
   AND A.PT_NO = Z.PT_NO

   --각 날짜들을 CHAR형식으로 변환하여 조회하였을 때 정상적인 값이 나오므로 아래 주석은 보류
   --AND A.OPDATE BETWEEN NVL(Z.ERDATE, Z.ADMDATE) AND Z.DSCHDATE

   AND TO_CHAR(A.OPDATE,'yyyymmdd') BETWEEN TO_CHAR(NVL(Z.ERDATE, Z.ADMDATE),'yyyymmdd')  AND TO_CHAR(Z.DSCHDATE,'yyyymmdd')


그런데 아래처럼 insert into만 붙여서 insert를 했습니다.
(편의상 쿼리를 간소화했을 뿐 실상 컬럼지정은 전부다 했습니다.)
그런데 INSERT 값은 13만건이 INSERT되더라구요. 신기했죠.

select count(1)     
  FROM  A        
     ,  Z        
 WHERE Z.DSCHDATE BETWEEN TO_DATE('20140101000000','YYYYMMDDHH24MISS') AND TO_DATE('20140131235959','YYYYMMDDHH24MISS')
   AND A.PT_NO = Z.PT_NO

   --각 날짜들을 CHAR형식으로 변환하여 조회하였을 때 정상적인 값이 나오므로 아래 주석은 보류
   --AND A.OPDATE BETWEEN NVL(Z.ERDATE, Z.ADMDATE) AND Z.DSCHDATE

   AND TO_CHAR(A.OPDATE,'yyyymmdd') BETWEEN TO_CHAR(NVL(Z.ERDATE, Z.ADMDATE),'yyyymmdd')  AND TO_CHAR(Z.DSCHDATE,'yyyymmdd')





뭔가 싶어. 해당 데이터가 INSERT된 테이블을 뒤적거렸습니다.
그리고 2100건 나온 조회조건과 데이터를 비교해보았지요.
 첫번째 쿼리의 조회값과 두번째 INSERT된 이후의 조회값을 비교했을 때의
사번을 비교했는데 당연히 첫번째 쿼리에서 두번째 쿼리에 없는 값이 있었지요.
그래서 해당 사번을 가지고 첫번째 쿼리에 대입해보았습니다.

그런데 더 웃긴건 조회가 되더라구요? 아니 왜? 2100건의 데이터를 전부 엑셀로 뽑아서
직접 찾아보아도 없는 값인데...
실상 사번을 조건으로 주면 조회가 되더랍니다.

사용하고 있는 툴이 토드인데, 골든, SQL_PLUS 다 같은 현상이더라구요.

그래서 주석이 풀린 쿼리와 같이 TO_CHAR로 변경하니까
정상적으로 모든 값이 잘 나온다는겁니다.

결론적으로는 해결은 된 셈입니다. 그런데 이론적으로 중요한부분을 놓치고 있는게 아닐까 싶어서요.
두루뭉실한 답이라도 있으면 좋겠는데, 위의 문제점에서는 결과만 해결 되었을 뿐
도대체 어떤문제로 해결이 된건지 전혀 감이 잡히지 않는다는게 문제입니다.
그냥 완전히 찍어 맞춰서 된거란거죠 ㅠ.ㅠ

이론상으로는 주석이 걸린 조회조건과, 주석이 안걸린 조회조건의 조회값이 같아야하는데,
제가 잘못알고 있는 부분이 있는지요?
문제는 해결했지만 같이 해결해주신분도 이론상 원인은 못찾겠다고 하셨습니다.

그래서 이렇게 장문의 글을 쓰며 도움을 구하게 되었습니다. ㅠ.ㅠ







by 마농 [2014.03.03 17:52:51]
조회 조건에 사용된 항목들의 데이터 타입이 뭔지 모두 확인하세요.
일단 모두 날짜타입이라 가정하고
주석조건(조건1) 과 안주석조건(조건2)은 실상 같다고 볼 수는 없습니다.
조건1은 날짜타입 그대로 조건으로 시분초까지를 포함할 수 있습니다.
조건2는 시분초를 제외한 조건으로 일자만을 비교합니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입