IS NULL: примеры (SQL)

Работа с NULL в Microsoft SQL Server: операторы IS NULL и IS NOT NULL
Раздел: Предикаты, Условия
IS NULL(expression IS [NOT] NULL): Boolean

Основы функции IS NULL и IS NOT NULL

Операторы IS NULL и IS NOT NULL в Microsoft SQL Server используются для проверки значений столбцов или выражений на наличие специального значения NULL, которое означает отсутствие данных или неопределенное значение.

Эти операторы применяются в условиях предложения WHERE, а также в конструкциях CHECK, CASE и HAVING. Оператор IS NULL возвращает TRUE, если выражение равно NULL. Оператор IS NOT NULL возвращает TRUE, если выражение не равно NULL.

Проверка на NULL с использованием обычных операторов сравнения (=, <>) не работает, так как NULL — это не значение, а состояние, означающее неизвестность. Сравнение любого значения, включая само NULL, с NULL при помощи оператора '=' возвращает UNKNOWN, что в логическом контексте трактуется как FALSE.

Простые примеры использования

Пример 1: Поиск строк с пустыми значениями.

SELECT * FROM Employees WHERE MiddleName IS NULL;
-- Возвращает сотрудников, у которых отчество не указано.

Пример 2: Выбор строк с заполненными данными.

SELECT * FROM Orders WHERE ShippedDate IS NOT NULL;
-- Возвращает заказы, которые уже были отправлены.

Пример 3: Комбинирование с другими условиями.

SELECT * FROM Products WHERE UnitPrice > 100 AND DiscontinuedDate IS NULL;
-- Возвращает активные товары с ценой выше 100.

Альтернативные функции в MS SQL

Для работы с NULL значениями в T-SQL также существуют следующие функции:

  • ISNULL(check_expression, replacement_value) — возвращает указанное заменяющее значение, если проверяемое выражение равно NULL. Иначе возвращает само выражение. Функция специфична для T-SQL.
  • COALESCE(expression [ ,...n ]) — возвращает первое выражение в списке, которое не равно NULL. Является стандартом ANSI SQL и более гибкой, чем ISNULL, так как принимает более двух аргументов.
  • NULLIF(expression, expression) — возвращает NULL, если два указанных выражения равны. В противном случае возвращает первое выражение. Полезно для обработки делений на ноль или стандартизации данных.

Операторы IS NULL и IS NOT NULL предпочтительнее использовать в условиях фильтрации WHERE и HAVING. Функции ISNULL и COALESCE чаще применяются в списках выборки SELECT или для вычисления значений по умолчанию.

Типичные ошибки

Основная ошибка — попытка использовать оператор равенства (=) для сравнения с NULL.

-- Неправильно. Этот запрос всегда вернет пустой результат.
SELECT * FROM Customers WHERE Region = NULL;
-- Результат: (0 строк затронуто)
-- Правильно
SELECT * FROM Customers WHERE Region IS NULL;

Ошибка при использовании NOT с неправильным синтаксисом.

-- Неправильно. Синтаксическая ошибка.
SELECT * FROM Products WHERE NOT DiscontinuedDate IS NULL;
-- Правильный вариант
SELECT * FROM Products WHERE DiscontinuedDate IS NOT NULL;
-- Или, что менее читаемо, но допустимо:
SELECT * FROM Products WHERE NOT (DiscontinuedDate IS NULL);

Непонимание трехзначной логики при использовании с оператором IN.

-- Если в списке IN есть NULL, это не приводит к ошибке, но может повлиять на логику.
SELECT * FROM Table1 WHERE id IN (1, 2, NULL);
-- Эквивалентно: id=1 OR id=2 OR id=NULL.
-- Поскольку id=NULL дает UNKNOWN, строка с id=1 или id=2 будет выбрана, а строка с id=NULL — нет.

Изменения в последних версиях

Синтаксис и логика работы операторов IS NULL и IS NOT NULL остаются неизменными и стабильными на протяжении многих версий SQL Server, начиная с самых ранних. Это базовые операторы, стандартизированные ANSI SQL.

Изменения в смежных областях, например, улучшения в обработке NULL функциями CONCAT или STRING_AGG в SQL Server 2017 и выше, не влияют напрямую на работу этих операторов.

Расширенные примеры

Пример 1: Использование в предложении CASE для формирования читаемого вывода.

Пример sql
SELECT 
    ProductName,
    CASE 
        WHEN DiscontinuedDate IS NULL THEN 'Active'
        ELSE 'Discontinued'
    END AS Status
FROM Products;
ProductName    Status
-----------    ----------
Chai           Active
Chang          Active
...            ...

Пример 2: Проверка на NULL в условиях соединения таблиц (JOIN).

Пример sql
SELECT 
    o.OrderID,
    c.CompanyName
FROM Orders o
LEFT JOIN Customers c ON o.CustomerID = c.CustomerID
WHERE o.ShipRegion IS NOT NULL
  AND c.Region IS NULL;
-- Находит заказы с указанным регионом доставки,
-- сделанные клиентами, у которых регион не указан.

Пример 3: Поиск записей, где хотя бы один из нескольких столбцов NULL.

Пример sql
SELECT * FROM EmployeeContacts 
WHERE WorkPhone IS NULL 
   OR MobilePhone IS NULL 
   OR Email IS NULL;

Пример 4: Комбинация с агрегатными функциями. Функции COUNT, SUM, AVG игнорируют NULL.

Пример sql
SELECT 
    AVG(COALESCE(Discount, 0)) AS AvgDiscountWithZero, -- Учитывает NULL как 0
    AVG(Discount) AS AvgDiscountIgnoreNull, -- Игнорирует NULL
    COUNT(*) AS TotalRows,
    COUNT(Discount) AS RowsWithDiscount -- Счетчик ненулевых скидок
FROM OrderDetails;

Пример 5: Создание ограничения (CONSTRAINT) с IS NOT NULL.

Пример sql
ALTER TABLE Employees 
ADD CONSTRAINT CK_Email_Required 
CHECK (WorkEmail IS NOT NULL);
-- Гарантирует, что поле WorkEmail будет обязательным для заполнения.

Пример 6: Нестандартное использование в SELECT для отладки.

Пример sql
SELECT 
    CustomerID,
    IIF(CompanyName IS NULL, 1, 0) AS IsCompanyNameNull
FROM Customers
ORDER BY IsCompanyNameNull DESC;

Аналоги в других СУБД и языках

MySQL, PostgreSQL, SQLite: Поддерживают стандартные операторы IS NULL и IS NOT NULL. Синтаксис идентичен SQL Server.

-- Пример для PostgreSQL/MySQL
SELECT * FROM users WHERE email IS NULL;
-- Результат одинаков во всех СУБД.

Oracle: Также использует IS NULL и IS NOT NULL. Вместо функции ISNULL() используется NVL() или стандартный COALESCE().

-- Oracle
SELECT NVL(commission_pct, 0) FROM employees;
-- Заменяет NULL в commission_pct на 0.

Sybase ASE: Синтаксис совместим с T-SQL, включает операторы IS NULL, IS NOT NULL и функцию ISNULL().

Языки программирования (C#, Java, Python): Проверка на NULL осуществляется через операторы сравнения с ключевым словом null (или None в Python), а не через специальный оператор SQL. Например, в C#: if (variable == null). Важно отличать логику проверки в SQL от логики в императивных языках.

MS SQL IS NULL function comments

En
IS NULL Determines whether a specified expression is NULL