368просмотров
27 августа 2024 г.
📷 ФотоScore: 405
Не делал хоть раз некорректную выгрузку из-за NULL - считай не жил 😅 #sql
Заметка про основные нюансы работы с NULL в СУБД. ➖Сравнение. Используйте для сравнения c NULL специальные операторы: IS NULL, IS NOT NULL. Сравнение поля с NULL через оператор равенства = всегда вернёт FALSE, т.к. даже NULL не равен NULL при сравнении через оператор равенства 😰 ➖Сравнение с отрицанием. Тут менее очевидный для новичков и более коварный случай. Используя запрос вида SELECT FROM books WHERE genre != 'Romance'
вы исключите из выборки не только романы, но и все строки в которых жанр равен NULL, т.к. field_name != NULL всегда возвращает FALSE. С оператором NOT IN точно такая же ситуация. Как решить? Оборачивайте поле в котором могут быть NULL в функцию coalesce: SELECT FROM books WHERE coalesce(genre, '') != 'Romance'
coalesce перебирает все переданные в неё аргументы по порядку и возвращает первое значение, отличное от NULL, таким образом NULL значения заменятся на пустую строку и запрос выдаст желаемый результат. ➖Агрегации. Помните, что count(), sum(), avg() и прочие агрегатные функции игнорируют NULL, за исключением count(*). Учитывайте это при расчетах, например, вам может понадобиться учитывать все строки в таблице при использовании avg(). ➖ Вычисления. Результатом арифметических операций с NULL всегда будет NULL: 7 + NULL = NULL. Если вы складываете значение двух полей обязательно оберните поля в coalesce(field_name, 0) для подстановки нуля, тогда ваши вычисления будут корректны. ➖ Пользовательский опыт. Не допускайте появления NULL в отчетах или дашбордах: замените NULL на что-то понятное пользователю, например, я часто подставляю строку "Не определено". Перешли пост другу, пока он не ошибся! А вы ошибались из-за NULL? 🧐 Если хотите еще про NULL, вот интересный пост про некоторые подробности их реализации в СУБД: О бедненьком NULLе замолвите слово