Одна из самых распространённых ошибок в SQL — неправильная фильтрация данных, если в столбце присутствуют значения
null. Например, у нас в курсе есть лёгкая задачка — отфильтровать всех пользователей, у которых поле company_id не равно 1. При этом в этом поле у многих записей стоит
null.Обычно студенты пишут такой запрос:
SELECT *
FROM users
WHERE company_id != 1
И вроде бы всё логично, но если проверить внимательно, то мы увидим, что потерялось около 80% записей!
❓ Почему так происходит
Если мы обратимся к документации, то в описании оператора
WHERE увидим: Синтаксис оператора: WHERE «условие». «условие» — это любое выражение типа boolean. Всё, что не true, исключается из результата.
А теперь идем в документацию оператора != и видим:
Если один из элементов сравнения равен null, то возвращается null, а не true/false.
Таким образом, получается, что все строки с
null выпадают из выборки, потому что такое сравнение возвращает null, а фильтр WHERE такие строки игнорирует. ❓ Как исправить
Исправить это можно, например, с помощью оператора
COALESCE, который заменит null на другое число (например, -1, т. к. его гарантированно не будет в этом столбце):SELECT *
FROM users
WHERE COALESCE(company_id, -1) != 1
Теперь вы на 100% знаете, почему эта ошибка возникает и как с ней бороться. Будьте внимательны — на больших данных обнаружить её очень сложно, а она может привести к ужасным погрешностям при расчётах.
Ставьте 🔥, если полезно!
📈 Симулейтив | 📱 ВК | 📱 YouTube | 📱 Канал о DS