2012-06-26 4 views
3

where 절의 작은 부분을 제외하고는 잘 작동하는 PL/SQL의 긴 부분이 있습니다.Oracle의 NOT IN 및 NOT LIKE 문에서 null을 처리하는 방법은 무엇입니까?

필드가 where 절 검사가 null이기 때문에 하나의 행이 반환되어야하지만 조건을 충족 시키더라도 행이 반환되지 않을 것으로 예상됩니다.

나는 여기에 아주 좋은 메모를 읽어
http://jonathanlewis.wordpress.com/2007/02/25/not-in/

그것은 널 (null)이 문에서 NOT에 미치는 영향을 설명하고 나는 그것뿐만 아니라 좋아하지에 대해 동일합니다 가정.

내가 찾을 수 없었던 것은 필자가 필적 할만한 대체품입니다. 어떻게 든 이것을 IN과 LIKE로 전환하거나 NULL이면 행을 반환 할 수있는 무언가를 제공해야합니까?

다음은 간단한 코드입니다.

내 경우에는 행이 Col_One과 Col_Two에서 모두 null이됩니다.

도움을 주시면 대단히 감사하겠습니다.

감사합니다.

답변

4

이 시도 :이 같은

AND (NVL(T.Col_One,'NuLl') NOT LIKE 'AString' 
     OR NVL(T.Col_Two,'NuLl') NOT IN ('BString','CString')) 
+0

이 완벽했다. 빠른 응답에 감사드립니다. 사실 NuLl을 값으로 삽입 할 수 있다고 생각했지만 비교를 위해서만 사용되었습니다. 다시 한번 감사드립니다. – dee

+4

이것은 일반적인 해결책이 아닙니다. 이 경우 우리는 'AString'이 'NuLl'이 될 수 없다는 것을 알고 있지만 실생활에서는 이것이 바운드 매개 변수가 될 것이며 클라이언트 응용 프로그램은 'NuLl'이 결코 전달되지 않는다는 것을 보장해야합니다. 명시 적으로 NULL을 테스트하고 "마법"값에 대한 의존성을 피하는 것이 좋습니다. –

+0

@Branko, 좋은 의견, 당신 말이 맞아요, 그리고 아마도 당신의 솔루션은 아마도 첫 번째 null 체크에서 단락 될 수 있기 때문에 성능이 더 좋을 것입니다. – DCookie

5

뭔가 작동합니다 :

T.Col_One IS NULL OR T.Col_One NOT LIKE 'AString' 
OR T.Col_Two IS NULL OR T.Col_Two NOT IN ('BString','CString') 

가 있다는 점 유의 하시길 바랍니다 ...

T.Col_Two NOT IN ('BString','CString') 

를 ... ...

에 해당
T.Col_Two <> 'BString' AND T.Col_Two <> 'CString' 

... T.Col_Two가 NULL 인 경우 NULL로 축소됩니다.

+0

예, NOT IN이 IN과 같지 않음을 상기시켜야합니다. 감사. – dee

2

NULLlike이 아니며 어떤 것과도 동일합니다. 유일한 유효한 테스트는 IS NULL이며 true를 반환합니다.