Исправляем MySQL запрос: исключаем '2' и NULL значения

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

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

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

Запомните, что операторы != и <> могут работать неправильно с NULL. Всегда используйте оператор IS NOT NULL совместно с ними. Например:

SQL
Скопировать код
SELECT * FROM ваша_таблица WHERE ваш_столбец IS NOT NULL AND ваш_столбец != 'некоторое_значение';

Важно помнить, что NULL обозначает "отсутствие известного значения", таким образом, сравнение с ним становится неоднозначным.

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

Обращаемся к функции COALESCE для работы с NULL

Чтобы заменить NULL на значение по умолчанию и обеспечить корректное сравнение, используйте функцию COALESCE:

SQL
Скопировать код
SELECT * FROM ваша_таблица WHERE COALESCE(ваш_столбец, 'значение_по_умолчанию') != 'некоторое_значение';

С помощью COALESCE мы преобразуем NULL в конкретное значение.

Применяем NULL-safe оператор сравнения <=>

SQL предлагает оператор <=>, безопасный для сравнения с NULL:

SQL
Скопировать код
SELECT * FROM ваша_таблица WHERE NOT(ваш_столбец <=> 'некоторое_значение');

Используя оператор сравнения, безопасный для NULL, мы упрощаем задачу сравнения.

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

Восприятие работы с NULL в SQL часто облегчается благодаря визуализации:

ЗначениеВаш запросРезультат
1!= 1✅ ИСТИНА
NULL!= 1❓ НЕИЗВЕСТНО

NULL в SQL аналогичен свободному месту за столом: если гостя нет, он не может выразить согласие или напротив, возразить.

🎯 Важно: всегда включайте проверку на NULL в ваш SQL-запрос

SQL
Скопировать код
SELECT * FROM таблица WHERE (столбец IS NULL OR столбец != 1);

Таким образом, мы не забываем учесть значения, обозначенные как NULL.

Работаем с NULL в разных ситуациях

Исключение конкретных значений

Для исключения определённого значения, например '2', с учётом NULL, можно использовать следующую конструкцию:

SQL
Скопировать код
SELECT * FROM ваша_таблица WHERE (ваш_столбец != 2 OR ваш_столбец IS NULL);

Мы исключаем '2' из результатов запроса, но при этом учитываем NULL.

Предотвращение неожиданных результатов при условной логике

Если вы хотите избежать неожиданных результатов при использовании NOT IN и IN в контексте NULL, воспользуйтесь следующим подходом:

SQL
Скопировать код
SELECT * FROM ваша_таблица WHERE (ваш_столбец NOT IN (1, 2) OR ваш_столбец IS NULL);

Сортировка с учётом NULL

При сортировке значения NULL обычно выстраиваются внизу списка. Чтобы контролировать их положение, используйте:

SQL
Скопировать код
SELECT * FROM ваша_таблица ORDER BY CASE WHEN ваш_столбец IS NULL THEN 1 ELSE 0 END, ваш_столбец;

Таким образом, мы поднимаем непустые значения при сортировке.

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

  1. MySQL :: MySQL 8.0 Reference Manual :: 14.4.2 Операторы сравнения и функции – в официальной документации подробно описаны операторы сравнения.
  2. Modern SQL: Трехзначная логика (3VL) — обзор и особенности – всё, что вам нужно знать о тонкостях логики SQL и работе с NULL.
  3. Особенности работы с NULL: сравнения, сортировки и тонкости в MySQL — подробное руководство по работе с NULL.
  4. Эффективные подходы к проверке на NULL в SQL — обсуждение на Stack Overflow о различных подходах к проверке на NULL.
  5. Трехзначная логика SQL — аналогия SQL-логики с музыкальным инструментом, где NULL играет роль третьей ноты.