Использование NULL в условиях

В SQL работа с NULL имеет свои особенности, поскольку NULL обозначает отсутствие значения или неизвестность. Это требует специальных подходов при составлении условий и фильтрации данных. Обычные операторы сравнения, такие как =, <, >, не работают с NULL так, как с обычными значениями. Вместо этого SQL предоставляет специальные операторы и функции для работы с NULL.

Проверка на NULL

Оператор IS NULL

Для проверки, является ли значение NULL, используется оператор IS NULL.

SELECT *
FROM employees
WHERE manager_id IS NULL;

Этот запрос находит сотрудников, у которых нет менеджера (т.е., manager_id равно NULL).

Оператор IS NOT NULL

Для проверки, что значение не является NULL, используется оператор IS NOT NULL.

SELECT *
FROM employees
WHERE manager_id IS NOT NULL;

Этот запрос находит сотрудников, у которых есть менеджер.

Работа с NULL в условиях

Использование функции COALESCE

Функция COALESCE возвращает первый ненулевой аргумент из списка.

SELECT employee_id, COALESCE(manager_id, 'No Manager') AS manager_status
FROM employees;

Этот запрос возвращает идентификатор менеджера, если он существует, или строку 'No Manager', если manager_id равно NULL.

Использование функции NULLIF

Функция NULLIF возвращает NULL, если два аргумента равны. В противном случае возвращает первый аргумент.

SELECT employee_id, NULLIF(bonus, 0) AS bonus_amount
FROM employees;

Этот запрос возвращает NULL для бонусов, равных 0, иначе возвращает значение бонуса.

Сравнение с NULL

= NULL и <> NULL

Прямое использование операторов сравнения с NULL не дает ожидаемых результатов. В SQL NULL = NULL всегда возвращает FALSE, так как NULL не равен никакому значению, включая другое NULL.

-- Не правильно:
SELECT *
FROM employees
WHERE bonus = NULL; -- Всегда возвращает пустой результат

IS DISTINCT FROM (в некоторых СУБД)

Некоторые СУБД, такие как PostgreSQL, поддерживают оператор IS DISTINCT FROM, который учитывает NULL.

SELECT *
FROM employees
WHERE salary IS DISTINCT FROM bonus;

Этот запрос вернет строки, где значение salary отличается от значения bonus, учитывая NULL.

Работа с NULL в агрегатных функциях

Агрегатные функции и NULL

Агрегатные функции, такие как SUM, AVG, MAX, MIN, игнорируют NULL значения.

SELECT AVG(salary) AS average_salary
FROM employees;

Этот запрос вычисляет среднюю зарплату, игнорируя NULL значения в столбце salary.

Использование функции COUNT

Функция COUNT с аргументом * подсчитывает все строки, включая те, где значения NULL, а COUNT(column_name) подсчитывает только те строки, где значение в указанной колонке не равно NULL.

-- Подсчет всех строк
SELECT COUNT(*) AS total_employees
FROM employees;

-- Подсчет строк с ненулевыми значениями в столбце salary
SELECT COUNT(salary) AS non_null_salaries
FROM employees;

Примеры использования NULL в сложных условиях

Фильтрация данных с учетом NULL

SELECT *
FROM orders
WHERE order_date BETWEEN '2024-01-01' AND '2024-12-31'
AND (shipped_date IS NULL OR shipped_date > '2024-06-30');

Этот запрос находит все заказы, сделанные в 2024 году, и либо не отправленные (то есть shipped_date равно NULL), либо отправленные после 30 июня 2024 года.

Условие с COALESCE для замены NULL значений

SELECT employee_id, COALESCE(bonus, 0) AS bonus
FROM employees;

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

Таблица булевой логики

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

a

b

a OR b

a AND b

a=b

NOT a

True

True

True

True

True

False

True

False

True

False

False

False

True

NULL

True

NULL

NULL

False

False

True

True

False

False

True

False

False

False

False

True

True

False

NULL

NULL

False

NULL

True

NULL

True

True

NULL

NULL

NULL

NULL

False

NULL

False

NULL

NULL

NULL

NULL

NULL

NULL

NULL

NULL

Заключение

Работа с NULL в SQL требует осведомленности о том, как SQL обрабатывает отсутствующие значения. Использование специальных операторов и функций позволяет корректно обрабатывать NULL и избегать ошибок при выполнении запросов. Важно помнить, что прямое сравнение с NULL не дает ожидаемых результатов, поэтому следует использовать IS NULL и IS NOT NULL для проверки наличия значения.

Last updated