Trampa
Borrado lógico y NULL
WHERE NOT is_deleted también descarta las filas en las que el indicador es NULL.NOT NULL es NULL, y WHERE solo conserva las filas verdaderas. Cuando un indicador de borrado puede estar vacío (una columna añadida después, un sistema
antiguo), escriba WHERE is_deleted IS NOT TRUE o, mejor, conviértalo una vez en un booleano real en staging:
COALESCE(is_deleted, false) AS is_deleted.
La trampa
WITH products(sku, is_deleted) AS (VALUES ('A', false), ('B', true), ('C', NULL))
SELECT sku FROM products WHERE NOT is_deleted ORDER BY sku;
| sku |
|---|
| A |
La corrección
WITH products(sku, is_deleted) AS (VALUES ('A', false), ('B', true), ('C', NULL))
SELECT sku FROM products WHERE is_deleted IS NOT TRUE ORDER BY sku;
| sku |
|---|
| A |
| C |
Practicar:Soft-deleted, or just NULL?