A_table에 대해서 파라미터로 받은 변수를 조건으로 컨트롤 하는 도중 발생한 문제입니다.
A_table :
| Lev1 | Lev2 |
| 가구 | 의자 |
| 가구 | 책상 |
| 에어컨 | |
| TV | |
| 컴퓨터 | 데스크탑 |
| 컴퓨터 | 노트북 |
이렇게 구성되어 있는 테이블에서
파라미터 => :Lev2 = null
SQL : SELECT * FROM A_table WHERE Lev2 = NVL(:Lev2, Lev2)
이렇게 한 결과
| Lev1 | Lev2 |
| 가구 | 의자 |
| 가구 | 책상 |
| 에어컨 | |
| TV | |
| 컴퓨터 | 데스크탑 |
| 컴퓨터 | 노트북 |
이렇게 기존의 테이블 값과 동일하게 모든 레코드를 출력하고 싶습니다.
하지만 nvl을 사용하여 null값을 체크하면 기존에 Lev2이 있는 값들만 비교를 하기 때문에 실질적으로
| Lev1 | Lev2 |
| 가구 | 의자 |
| 가구 | 책상 |
| 컴퓨터 | 데스크탑 |
| 컴퓨터 |
노트북 |
이런 결과값이 나와버립니다.
결론 : A_table 테이블을 조회할때 파라미터 :Lev2가 NULL일때는 NULL값 유무와 상관없이 기존의 모든 레코드가 출력되게 하고 싶습니다.
-------------------------------------------------------------------------------------------------------------------------------------------------------
아래의 결과처럼 나오게 하고싶습니다.
:Lev2 = 책상
SELECT * FROM A_table WHERE Lev2 = NVL(:Lev2, Lev2)
| Lev1 | Lev2 |
| 가구 | 책상 |
:Lev2 = null
SELECT * FROM A_table WHERE Lev2 = NVL(:Lev2, Lev2)
| Lev1 | Lev2 |
| 가구 | 의자 |
| 가구 | 책상 |
| 에어컨 | |
| TV | |
| 컴퓨터 | 데스크탑 |
| 컴퓨터 | 노트북 |
SELECT * FROM A_table WHERE NVL(Lev2 , 1) LIKE DECODE(:Lev2 , NULL, '%', :Lev2 )
이렇게 해결했습니다!
혹시 더 좋은 방법이 있으면 공유부탁드립니다~
SELECT *
FROM A_table
WHERE :Lev2 IS NULL
OR (:Lev2 IS NOT NULL AND Lev2 =:Lev2)
;
좌변을 가공하지 않고 =로 비교해야 인덱스를 활용 하는데 좋습니다.
감사합니다! 배움이 되었습니다.