Как обработать NULL в SQL (IS NULL и COALESCE)?
В таблице у части пользователей поле phone пустое (NULL). Когда пишу WHERE phone = NULL, ничего не находится. Как правильно проверять и заменять NULL в SQL? Что за функция COALESCE?
2 ответа
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 целиком.
Частые ошибки:
WHERE x = NULLилиWHERE x <> NULL— никогда не пишите, используйте IS NULL.- Забывать, что
COUNT(column)иAVGуже игнорируют NULL, аCOUNT(*)— нет.
Помимо COALESCE есть похожие функции-диалекты: IFNULL(x, 0) в MySQL, ISNULL(x, 0) в SQL Server, NVL(x, 0) в Oracle. Все делают то же — подставляют значение вместо NULL. Но COALESCE стандартный, работает почти везде и умеет принимать несколько аргументов: COALESCE(mobile, home, work, 'нет телефона') вернёт первый заполненный. Поэтому привыкайте к COALESCE.