쿼리 작성한 대로 실행되는게 아니라
쿼리 변환 과정을 통해 최적화를 시킨 후에 실행됩니다.
쿼리 변환 중에 뷰머징이 실행된 것입니다.
뷰머징은 인라인뷰를 메인쿼리로 합치는 것입니다.
뷰머징이 안되도록 하는 방법으로 힌트주기 방법이 있고
- 인라인뷰 안에 힌트 주기. /*+ no_merge */
뷰머징이 불가능한 쿼리로 만드는 방법이 있습니다.
- ROWNUM, DISTINCT, GROUP BY, UNION 등등.
애초에 숫자 변환이 필요한건지 의문이네요?
년도 4자리 잘라왔는데 왜 숫자 두자리랑 비교하죠?
컬럼을 숫자로 가공하여 숫자와 비교하지 마시고
컬럼은 그대로 두고 문자 4자리와 비교한다면?
애초에 이런 문제가 발생하지 않았을 것입니다.
WITH T AS ( SELECT '20010101' BIRTHDAY FROM DUAL UNION ALL SELECT '19820101' BIRTHDAY FROM DUAL UNION ALL SELECT '*' BIRTHDAY FROM DUAL UNION ALL SELECT '19990101' BIRTHDAY FROM DUAL ) SELECT FLOOR(MONTHS_BETWEEN(SYSDATE, TO_DATE(BIRTHDAY, 'YYYYMMDD')) / 12) AGE , BIRTHDAY FROM T WHERE BIRTHDAY !='*' --AND FLOOR(MONTHS_BETWEEN(SYSDATE, TO_DATE(BIRTHDAY, 'YYYYMMDD')) / 12) <= 19 AND BIRTHDAY <= TO_CHAR(ADD_MONTHS(SYSDATE, -19 * 12), 'YYYYMMDD')
이런식으로 해보세요.