Выбор ответа Middle SELECT и фильтрация спрашивают часто обновлено

NOT IN со списком, где есть NULL

Вопрос

В таблице t колонка id содержит значения 1, 2, 3, 4, 5. Что вернёт запрос?

SELECT id FROM t WHERE id NOT IN (1, 2, NULL);

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Ни одной строки. id NOT IN (1, 2, NULL) раскрывается в id < 1 AND id < 2 AND id < NULL.

Варианты ответа

  1. Строки 3, 4, 5
  2. Строки 3, 4, 5 и ошибку-предупреждение
  3. Ни одной строкиправильный ответ
  4. Все пять строк

Разбор

id NOT IN (1, 2, NULL) раскрывается в id <> 1 AND id <> 2 AND id <> NULL. Последнее сравнение всегда NULL, и всё выражение в лучшем случае NULL, но никогда не true. Значит, WHERE отбросит все строки. Ожидание «3, 4, 5» и есть типичная ловушка; никаких предупреждений PostgreSQL не выдаёт.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.