У меня был запрос (для Postgres и Informix) с NOT IN
предложением, содержащим подзапрос, который в некоторых случаях возвращал NULL
значения, в результате чего это предложение (и весь запрос) ничего не возвращало.
Какой лучший способ понять это? Я думал, NULL
что это что-то без значения, и поэтому не ожидал, что запрос потерпит неудачу, но, очевидно, это неправильный способ мышления NULL
.
postgresql
query
null
informix
newenglander
источник
источник
x <> NULL
разрешениеFALSE
, вы можете рассчитыватьNOT (x <> NULL)
на оценкуTRUE
, а это не так. Оба оцениваютUNKNOWN
. Хитрость заключается в том, что строка выбирается только в том случае, еслиWHERE
предложение (если присутствует) оценивается какTRUE
- строка опускается, если предложение оценивается либо в,FALSE
либо вUNKNOWN
. Такое поведение (в целом и дляNOT IN
предиката в частности) предписывается стандартом SQL.NULL NOT IN (some_subquery)
не должен возвращать внешнюю строку, кроме случаев, когдаsome_subquery
не возвращает никаких строк. Вот почему план выполнения, когда оба столбца имеют нулевое значение, может быть значительно дороже. Пример SQL Server