Обработка NULL значений в IN clause: PostgreSQL

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для включения в выборку значений, равных NULL, можно применить соединение операторов IN и IS NULL:

SQL
Скопировать код
SELECT * FROM table WHERE column IN (1, 2) OR column IS NULL;

Этот запрос вернёт строки, где столбец column принимает значения 1, 2 или NULL.

Кинга Идем в IT: пошаговый план для смены профессии

Маневрирование с подзапросами в условии IN

Если вас ожидает работа со сложными выборками, не стоит беспокоиться. IN может принимать результаты подзапросов, что позволяет реализовывать многомерную фильтрацию:

SQL
Скопировать код
SELECT * FROM table WHERE id_field IN (SELECT id FROM linked_table WHERE condition);
-- Да, запрос внутри запроса — это вполне нормально.

Такая стратегия не включает значения NULL. Чтобы они также участвовали в выборке, добавьте OR с IS NULL:

SQL
Скопировать код
SELECT * FROM table WHERE id_field IN (SELECT id FROM linked_table WHERE condition) OR id_field IS NULL;
-- Вот оно, пропущенное значение NULL!

Визуализация

Процесс выполнения запроса можно представить как поиск ключей:

Markdown
Скопировать код
Потенциальные ключи: [🔑, 🔑🔒, 🔑, null, 🔑]

IN ведёт себя так, как если бы охранник проверял ключи по списку:

SQL
Скопировать код
SELECT * FROM keys WHERE key_type IN ('🔑', null);

Однако для обнаружения "null" ключа охраннику потребуется специальный приём — применение IS NULL:

Markdown
Скопировать код
Результаты для 🔑: [✅, ✅, ✅, ❌, ✅]
Результаты для null: [❌, ❌, ❌, ✅, ❌]

Объединив результаты, вы получите все необходимые ключи:

Markdown
Скопировать код
SELECT * FROM keys WHERE key_type IN ('🔑') OR key_type IS NULL;

Итоговый результат:

Markdown
Скопировать код
Найдены: [🔑 (✅), 🔑🔒 (✅), 🔑 (✅), null (✅), 🔑 (✅)]

Все ключи имеются, включая загадочный 'null'!

Оператор COALESCE: трансформация NULL

Если вам нужно заменить NULL на какое-либо специфическое значение, функция COALESCE станет весьма полезной. Она подставляет заданное значение по умолчанию вместо NULL, что позволяет включать его в условие IN:

SQL
Скопировать код
SELECT * FROM table WHERE COALESCE(column, default_value) IN (1, 2, default_value);
-- Вот таким образом наши значения null обретают элегантный "наряд" по умолчанию.

Остерегайтесь уловок NOT IN

Здесь стоит быть особенно внимательным: NOT IN может подвести, если в список попадает NULL. В таком случае, NOT IN вернёт FALSE. Для безопасности убедитесь, что в список не попадает NULL, перед тем как воспользоваться NOT IN:

SQL
Скопировать код
SELECT * FROM table WHERE column NOT IN (SELECT id FROM linked_table WHERE column IS NOT NULL);
-- В нашем "клубе" NOT IN "чёрный вход" для NULL!

Лучшие практики SQL

Чтобы достичь высокого уровня владения SQL, рекомендуется придерживаться следующих правил:

  • Откажитесь от SELECT *, лучше указывайте интересующие вас столбцы явно.
  • Группируйте условия с помощью скобок для корректного задания приоритетов.
  • Совершенствуйте свои навыки: формируйте чистые, понятные и эффективные запросы.
  • Обучайтесь постоянно: изучайте статьи, документацию, чтобы усвоить нюансы обработки NULL.

Полезные материалы

  1. Обработка NULL в условии NOT IN на Stack Overflow — детальное обсуждение вопроса использования IN и NOT IN с NULL в SQL.
  2. Руководство по MySQL 8.0: Функции сравнения и операторы — официальное руководство, рассматривающее использование IN и обработку NULL.
  3. SQL-выражения в SQLite — подробное руководство по SQL-выражениям, включая работу с NULL и IN в SQLite.
  4. PostgreSQL: операции сравнения строк и массивов — официальная документация, посвященная сравнению NULL и использованию оператора IN.