Как NULL в SQL работает в следующем сценарии? - PullRequest
0 голосов
/ 14 ноября 2018

Я практикую SQL и понял, что NULL в SQL довольно удивительно: " entity ".

Таблица " xo " См. Ссылку на структуру и содержание таблицы

Когда я запускаю следующий запрос SQL

select a from xo where a not in (select c from xo) ;

возвращает без строк . Когда я запускаю этот запрос

select a from xo where a  in (select c from xo);

Это работает так, как я предсказываю.

Не могли бы вы объяснить, как на самом деле работает вышеуказанная вещь? и было бы очень полезно, если бы вы могли предоставить некоторые дополнительные ресурсы, чтобы по-настоящему понять NULL .

Fiddle

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Не используйте NOT IN с подзапросами!Когда подзапрос возвращает значение NULL, он имеет поведение, которое вы видите.Строки не возвращаются.

По этой причине я настоятельно рекомендую NOT EXISTS или LEFT JOIN / WHERE.Итак:

select a
from xo
where not exists (select 1 from xo xo2 where xo2.c = xo.a);

Это вернет дополнение:

select a
from xo
where exists (select 1 from xo xo2 where xo2.c = xo.a);

Техническая причина, по которой это происходит, заключается в том, что NULL является неизвестным значением, а неособая ценностьИтак:

1 in (1, 2, 3) returns TRUE
1 not in (1, 2, 3) returns FALSE

Но:

1 in (1, 2, 3, NULL) returns TRUE, because 1 is explicitly in the list
1 in (2, 3, NULL) returns NULL (equivalent to FALSE) because `NULL` could be 1 or not

И:

1 not in (1, 2, 3, NULL) returns FALSE because 1 is explicitly in the list
1 not in (2, 3, NULL) returns NULL, because 1 could be in the list

Итак, когда любое значение равно NULL, NOT IN возвращает либо FALSE, либо NULL - и, следовательно, все строки отфильтровываются.

0 голосов
/ 14 ноября 2018

Это потому, что NULL s обрабатываются специально в SQL.Всякий раз, когда вы сравниваете что-то с NULL, он возвращает неизвестно , что, в свою очередь, не соответствует сравнению в NOT IN условии.

Это одна из причин, по которой рекомендуется использовать EXISTS() более NOT IN.

скрипка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...