IS NULL: примеры (SQL)
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 для формирования читаемого вывода.
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).
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.
SELECT * FROM EmployeeContacts
WHERE WorkPhone IS NULL
OR MobilePhone IS NULL
OR Email IS NULL;Пример 4: Комбинация с агрегатными функциями. Функции COUNT, SUM, AVG игнорируют NULL.
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.
ALTER TABLE Employees
ADD CONSTRAINT CK_Email_Required
CHECK (WorkEmail IS NOT NULL);-- Гарантирует, что поле WorkEmail будет обязательным для заполнения.
Пример 6: Нестандартное использование в SELECT для отладки.
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 от логики в императивных языках.