it-swarm-eu.dev

Proč NOT IN se sadou obsahující NULL vždy vrací FALSE / NULL?

Měl jsem dotaz (pro Postgres a Informix) s NOT IN klauzule obsahující poddotaz, který v některých případech vrátil hodnoty NULL, což způsobí, že klauzule (a celý dotaz) nevrátí nic.

Jaký je nejlepší způsob, jak tomu porozumět? NULL jsem považoval za něco bez hodnoty, a proto jsem neočekával, že dotaz selže, ale očividně to není správný způsob, jak myslet na NULL.

21
newenglander

Logická logika - nebo Logika se třemi hodnotami

  • IN je zkratka pro řadu podmínek OR)
  • x NOT IN (1, 2, NULL) je stejné jako NOT (x = 1 OR x = 2 OR x = NULL)
  • ... je stejné jako x <> 1 AND x <> 2 AND x <> NULL
  • ... je stejné jako true AND true AND unknown **
  • ... = unknown **
  • ... což je v tomto případě téměř stejné jako false, protože neprojde podmínkou WHERE **

Proto proto lidé používají EXISTS + NOT EXISTS spíše než IN + NOT IN. Viz také Použití logiky NOT ve vztahu k indexům pro více informací

** Poznámka: unknown je stejné jako false na konci výrazu v podmínce WHERE.
Když je výraz vyhodnocen, pak není znám
Důvod proč najdete v komentáři @ kgrittn níže

29
gbn