null or 쿼리 질문있습니다. 0 3 1,148

by 김중선 [SQL Query] or null [2018.08.29 10:08:06]


아래와 같은 쿼리에서 

SELECT  *
FROM    TABLE_AA A 
WHERE   (:TABLE__NM IS NULL OR A.TABLE_NM = :TABLE_NM)

TABLE__NM을 바인딩 받아서 처리하고 있는데 

질문은

1. TABLE__NM값이 '' 이면 :TABLE__NM IS NULL 부분만 돌고 or 뒷부분(A.TABLE_NM = :TABLE_NM)은 실행되지 않고 돌아가나요?

2. 아래 두개의 쿼리는 같다고 보면되나요? 

    1. TABLE_NM IS NULL

    2. TABLE_NM = ''

---

앗 오라클 입니다.

by 우리집아찌 [2018.08.29 10:15:45]

DBMS가 무엇인지 우선 중요합니다.

오라클에서는 ''은 NULL로 인지하고

MS-SQL은 '' 은 그냥 '' 입니다.

아.. 그리고 null은 부등호( = , < , > )으로 필터링되지 않습니다.

is null , is not null 을 사용해야합니다. null 은 아무것도 없다는 개념입니다. 


by 야신 [2018.08.29 22:50:30]

:TABLE__NM 이 Null 이라면

:TABLE__NM Is null 조건이 항상 참이 되면서 뒤는 실행하지 않죠. 그래서 전체가 조회됨

 

:TABLE__NM 이 값을 가진다면 첫번째 조건은 거짓이 되고 두번째 조건에서 맞는값을 찾게되죠

 


by 마농 [2018.08.30 09:45:01]

1. 조건값이 들어오는 경우 => 조건에 해당하는 자료 조회
2. 조건값이 들어오지 않는 경우 => 전체 자료 조회
이 두가지 경우를
프로그램에서 IF 문으로 분기하여 두개의 쿼리를 따로 돌리는 것이 아닌
IF 문 없이 하나의 쿼리로 구현하는 방법 중 하나입니다.
이때 OR 조건이 어떻게 풀리느냐도 주목해야 합니다.
실행계획을 확인해야 하는데요.
OR 로 풀리는 경우 와 Concat 으로 풀리는 경우가 있습니다.
OR 는 하나의 통쿼리로 풀스캔하여 or 조건 처리하는 거구요.
Concat 은 쿼리가 두개로 분리되어 union 하는 형상입니다.
1번의 경우엔 인덱스를 타는 쿼리
2번의 경우엔 풀스캔을 타는 쿼리
이렇게 분리되는 거죠.
OR 로 풀릴 경우엔 1,2 번 모두 풀스캔을 타게 되어 1번조건에 대한 성능이 나오질 않습니다.
Concat 으로 풀릴 경우 1,2번 모두 효율적으로 동작하게 됩니다.
따라서 concat 을 타도록 유도해야 하며
or 로 탄다면? /*+ use_concat */ 힌트를 사용해 유도할 수 있습니다.
아니면 처음부터 UNION ALL 쿼리로 작성하는 것도 한 방법입니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입