NULL을 포함하는 세트로 NOT IN이 항상 FALSE / NULL을 리턴하는 이유는 무엇입니까?


21

NOT IN하위 쿼리가 포함 된 절이 있는 쿼리 (Postgres 및 Informix 용)에 경우에 따라 NULL값을 반환 하여 해당 절 (및 전체 쿼리)이 아무것도 반환하지 못하게했습니다.

이것을 이해하는 가장 좋은 방법은 무엇입니까? 나는 NULL가치가없는 것으로 생각했기 때문에 쿼리가 실패 할 것으로 예상하지 않았지만 분명히 올바른 생각은 아닙니다 NULL.

답변:


29

부울 논리-또는 3 가지 값 논리

  • IN은 일련의 OR 조건의 약어입니다
  • x NOT IN (1, 2, NULL) 와 같다 NOT (x = 1 OR x = 2 OR x = NULL)
  • ... 와 같다 x <> 1 AND x <> 2 AND x <> NULL
  • ... true AND true AND unknown** 와 동일
  • ... = unknown**
  • ... falseWHERE조건을 통과하지 않기 때문에이 경우 와 거의 같습니다 ...

이제 사람들이 EXISTS+ NOT EXISTS대신 IN+를 사용하는 이유 NOT IN입니다. 또한 참조 인덱스 관련 NOT 논리의 사용을 이상

** 참고 : 조건 의 식 끝에서 unknown와 동일 합니다. 식을 평가하는 동안 알 수없는 이유는 아래의 @kgrittn의 설명을 참조하십시오.falseWHERE


10
설명이 있더라도 기술적으로 잘못되어 누군가를 태울 수 있습니다. 예를 들어 x <> NULL를 해결하는 FALSE것으로 NOT (x <> NULL)평가하면로 평가할 것으로 예상 TRUE되지만 그렇지 않습니다. 둘 다로 평가됩니다 UNKNOWN. 요령은 WHERE(있는 경우) 절이 평가되는 경우 에만 행을 선택하는 것입니다. 절이 또는로 TRUE평가되면 행이 생략됩니다 . 이 동작 (일반적으로, 특히 술어에 대한)은 SQL 표준에 의해 규정됩니다. FALSEUNKNOWNNOT IN
kgrittn

또한 NULL NOT IN (some_subquery)행을 some_subquery반환하지 않는 경우를 제외하고 외부 행을 반환해서는 안됩니다 . 그렇기 때문에 두 열 모두 Null을 사용할 수있는 경우 실행 계획이 훨씬 더 비쌀 수 있습니다. SQL Server 예
Martin Smith
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.