Найти в Дзене

Работа с NULL значениями в SQL

Работа с NULL значениями в SQL Часто бывает такое, что вместо явного значения данных в таблице попадаются NULL - "пустые" значения. И когда стоит задача отфильтровать данные, то у неопытных аналитиков и инженеров могут возникать сложности с такими пустыми значениями. Почему так происходит? В большинстве случаев фильтры пишутся с указанием явных значений в данных: конкретная строка/строки, число/числа, дата/даты Например, найти заказы, в которых участвовали продукты с id 4, 7, 9 SELECT * FROM orders WHERE product_id IN (4,7,9) Здесь все понятно. А если нужно наоборот исключить такие продукты из запроса? SELECT * FROM orders WHERE product_id NOT IN (4,7,9) Тоже вроде ок. НО если в таблице есть строки где product_id будет значением NULL, то такие строки не попадут ни в первый ни во второй запрос - а значит могут потеряться в аналитике совсем. Помните про этот момент и не забывайте про конструкции IS NULL и IS NOT NULL - это фильтры, которые позволяют работать с пустыми значениями и не

Работа с NULL значениями в SQL

Часто бывает такое, что вместо явного значения данных в таблице попадаются NULL - "пустые" значения. И когда стоит задача отфильтровать данные, то у неопытных аналитиков и инженеров могут возникать сложности с такими пустыми значениями.

Почему так происходит?

В большинстве случаев фильтры пишутся с указанием явных значений в данных: конкретная строка/строки, число/числа, дата/даты

Например, найти заказы, в которых участвовали продукты с id 4, 7, 9

SELECT *

FROM orders

WHERE product_id IN (4,7,9)

Здесь все понятно. А если нужно наоборот исключить такие продукты из запроса?

SELECT *

FROM orders

WHERE product_id NOT IN (4,7,9)

Тоже вроде ок. НО если в таблице есть строки где product_id будет значением NULL, то такие строки не попадут ни в первый ни во второй запрос - а значит могут потеряться в аналитике совсем.

Помните про этот момент и не забывайте про конструкции IS NULL и IS NOT NULL - это фильтры, которые позволяют работать с пустыми значениями и не терять их в запросах.

Как еще можно работать с NULL: заменять их в явном виде на строку или любое нужное значение

Например, c помощью CASE

CASE WHEN product_id IS NULL THEN 'empty' ELSE product_id END AS product_id

Тогда дальше с этими значениями можно работать через обычный синтаксис фильтраций, не боясь забыть про NULL

Классно расписано про NULL еще в этой статье

Ну и не забывайте про COUNT(*), COUNT(column), COUNT(DISTINCT column), где NULL также учитывается по разному 🤓

👍 если пост полезен