Обычное сравнение ломается на
NULL:
SELECT NULL = NULL;
-- NULL
Поэтому условие:
WHERE old_value = new_value
не считает два
NULL равными.В PostgreSQL используйте:
WHERE old_value IS NOT DISTINCT FROM new_value
Оператор работает как безопасный аналог
=:
1 IS NOT DISTINCT FROM 1 -- true
NULL IS NOT DISTINCT FROM NULL -- true
1 IS NOT DISTINCT FROM NULL -- false
Полезно при сравнении версий строк, поиске изменений и синхронизации таблиц:
SELECT *
FROM old_data o
JOIN new_data n USING (id)
WHERE o.email IS DISTINCT FROM n.email;
Запрос вернёт строки, где значение действительно изменилось, включая переходы
NULL → значение и значение → NULL.