Обработка NULL значений в IN clause: PostgreSQL
Быстрый ответ
Для включения в выборку значений, равных NULL, можно применить соединение операторов IN
и IS NULL
:
SELECT * FROM table WHERE column IN (1, 2) OR column IS NULL;
Этот запрос вернёт строки, где столбец column
принимает значения 1
, 2
или NULL
.
Маневрирование с подзапросами в условии IN
Если вас ожидает работа со сложными выборками, не стоит беспокоиться. IN
может принимать результаты подзапросов, что позволяет реализовывать многомерную фильтрацию:
SELECT * FROM table WHERE id_field IN (SELECT id FROM linked_table WHERE condition);
-- Да, запрос внутри запроса — это вполне нормально.
Такая стратегия не включает значения NULL
. Чтобы они также участвовали в выборке, добавьте OR
с IS NULL
:
SELECT * FROM table WHERE id_field IN (SELECT id FROM linked_table WHERE condition) OR id_field IS NULL;
-- Вот оно, пропущенное значение NULL!
Визуализация
Процесс выполнения запроса можно представить как поиск ключей:
Потенциальные ключи: [🔑, 🔑🔒, 🔑, null, 🔑]
IN
ведёт себя так, как если бы охранник проверял ключи по списку:
SELECT * FROM keys WHERE key_type IN ('🔑', null);
Однако для обнаружения "null" ключа охраннику потребуется специальный приём — применение IS NULL
:
Результаты для 🔑: [✅, ✅, ✅, ❌, ✅]
Результаты для null: [❌, ❌, ❌, ✅, ❌]
Объединив результаты, вы получите все необходимые ключи:
SELECT * FROM keys WHERE key_type IN ('🔑') OR key_type IS NULL;
Итоговый результат:
Найдены: [🔑 (✅), 🔑🔒 (✅), 🔑 (✅), null (✅), 🔑 (✅)]
Все ключи имеются, включая загадочный 'null'!
Оператор COALESCE: трансформация NULL
Если вам нужно заменить NULL
на какое-либо специфическое значение, функция COALESCE
станет весьма полезной. Она подставляет заданное значение по умолчанию вместо NULL
, что позволяет включать его в условие IN
:
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
:
SELECT * FROM table WHERE column NOT IN (SELECT id FROM linked_table WHERE column IS NOT NULL);
-- В нашем "клубе" NOT IN "чёрный вход" для NULL!
Лучшие практики SQL
Чтобы достичь высокого уровня владения SQL, рекомендуется придерживаться следующих правил:
- Откажитесь от
SELECT *
, лучше указывайте интересующие вас столбцы явно. - Группируйте условия с помощью скобок для корректного задания приоритетов.
- Совершенствуйте свои навыки: формируйте чистые, понятные и эффективные запросы.
- Обучайтесь постоянно: изучайте статьи, документацию, чтобы усвоить нюансы обработки
NULL
.
Полезные материалы
- Обработка NULL в условии NOT IN на Stack Overflow — детальное обсуждение вопроса использования
IN
иNOT IN
сNULL
в SQL. - Руководство по MySQL 8.0: Функции сравнения и операторы — официальное руководство, рассматривающее использование
IN
и обработкуNULL
. - SQL-выражения в SQLite — подробное руководство по SQL-выражениям, включая работу с
NULL
иIN
в SQLite. - PostgreSQL: операции сравнения строк и массивов — официальная документация, посвященная сравнению
NULL
и использованию оператораIN
.