NULL и проверка на пустоту
Разбираемся со специальным значением NULL и тем, как с ним работать.
NULL — это не ноль и не пустая строка, а отметка «значение отсутствует или неизвестно».
Что такое NULL
NULL означает «данных нет». У пользователя может быть не указан телефон, у заказа — не проставлена дата доставки. Это не ноль (0 — это известное число) и не пустая строка ('' — это известная строка нулевой длины). NULL — именно отсутствие значения.
Почему = NULL не работает
Любое сравнение с NULL даёт не «истину» и не «ложь», а снова NULL (неизвестно). Поэтому условие WHERE phone = NULL не найдёт ничего. Убедимся:
SELECT NULL = NULL AS sravnenie,
NULL IS NULL AS proverka,
5 = NULL AS pyat_ravno_null;
Вывод:
|1|
Первый и третий столбцы пусты — это NULL (результат неизвестен). Только средний столбец вернул 1 (истину), потому что использовал правильный оператор IS NULL.
IS NULL и IS NOT NULL
Для проверки на пустоту есть специальные операторы: IS NULL (значение отсутствует) и IS NOT NULL (значение есть). Найдём пользователей без телефона:
CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, phone TEXT);
INSERT INTO users (name, phone) VALUES
('Аня', '+7900'), ('Борис', NULL),
('Вера', NULL), ('Глеб', '+7901');
SELECT name FROM users WHERE phone IS NULL;
Вывод:
Борис Вера
COALESCE — значение по умолчанию
Часто вместо пустоты хочется показать заглушку. Функция COALESCE(a, b, ...) возвращает первый аргумент, который не NULL. Подставим текст вместо отсутствующего телефона:
CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, phone TEXT);
INSERT INTO users (name, phone) VALUES
('Аня', '+7900'), ('Борис', NULL);
SELECT name, COALESCE(phone, 'нет телефона') AS contact
FROM users;
Вывод:
Аня|+7900 Борис|нет телефона
NULL в сортировке и подсчёте
Полезно помнить пару правил: при ORDER BY в SQLite значения NULL идут первыми (считаются «меньше» всего). А агрегатная функция COUNT(столбец) не считает строки, где этот столбец NULL, тогда как COUNT(*) считает все строки. К агрегатам мы вернёмся в отдельном разделе.
Итог
- NULL — это «значение отсутствует», а не ноль и не пустая строка.
- Сравнение с NULL через
=всегда даёт NULL; для проверки используйтеIS NULL/IS NOT NULL. COALESCE(a, b)подставляет запасное значение вместо NULL.