Одна из самых распространенных ошибок в 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% знаете, почему эта ошибка возникает и как с ней бороться. Будьте внимательны — на больших данных обнаружить ее очень сложно, а она может привести к ужасным погрешностям при расчетах.
Наберем 50 реакций на этот пост? И мы разберем в таком формате еще другие ошибки, и не только в SQL🤓