← Все вопросы

Как обработать NULL в SQL (IS NULL и COALESCE)?

Задан 10 месяцев назад1.2к просмотров2 ответа
10

В таблице у части пользователей поле phone пустое (NULL). Когда пишу WHERE phone = NULL, ничего не находится. Как правильно проверять и заменять NULL в SQL? Что за функция COALESCE?

2 ответа

15
✓ Принятый ответ — помог автору

NULL — это не значение, а «неизвестно/отсутствует», поэтому обычное сравнение с ним не работает: phone = NULL всегда даёт «неизвестно», и строка не возвращается.

Проверка на NULL — только через IS NULL / IS NOT NULL:

SELECT * FROM users WHERE phone IS NULL;      -- телефон не указан
SELECT * FROM users WHERE phone IS NOT NULL;   -- телефон есть

Замена NULL на значение по умолчанию — функция COALESCE, которая возвращает первый не-NULL аргумент:

SELECT name, COALESCE(phone, 'не указан') AS phone
FROM users;

Где телефон NULL — выведется «не указан».

Это особенно важно в вычислениях: любая арифметика с NULL даёт NULL. Например, price + discount, если discount NULL, вернёт NULL, а не price. Спасает COALESCE:

SELECT price + COALESCE(discount, 0) AS final_price FROM products;

И при конкатенации строк NULL «съедает» результат: в некоторых СУБД name || surname, если surname NULL, даст NULL целиком.

Частые ошибки:

  1. WHERE x = NULL или WHERE x <> NULL — никогда не пишите, используйте IS NULL.
  2. Забывать, что COUNT(column) и AVG уже игнорируют NULL, а COUNT(*) — нет.
6

Помимо COALESCE есть похожие функции-диалекты: IFNULL(x, 0) в MySQL, ISNULL(x, 0) в SQL Server, NVL(x, 0) в Oracle. Все делают то же — подставляют значение вместо NULL. Но COALESCE стандартный, работает почти везде и умеет принимать несколько аргументов: COALESCE(mobile, home, work, 'нет телефона') вернёт первый заполненный. Поэтому привыкайте к COALESCE.

Ваш ответ

Войдите, чтобы ответить на вопрос.