WHERE active OR NOT active не возвращает все строкиВ обычной логике это утверждение верно всегда. В SQL есть третье значение:
NULL означает «неизвестно», и NULL OR NOT NULL тоже неизвестно, а WHERE оставляет только строки, где условие истинно. Строка с active = NULL молча выпадает. Кристофер Уинслетт из Crunchy Data собрал все места, где так происходит.Запомнить стоит три вещи.
NULL = NULL даёт не true, а NULL, поэтому существует IS NULL, а для сравнения «с учётом неизвестного» есть IS NOT DISTINCT FROM. Любая арифметика с NULL даёт NULL: quantity * unit_price обнулит колонку в UPDATE, если хотя бы одно поле пустое, лечится COALESCE. И самое коварное: x NOT IN (1, 2, NULL) не вернёт ни одной строки, потому что раскрывается в цепочку AND с неизвестным внутри. Автор советует самое простое: где значение обязано быть, ставить NOT NULL в схеме.#sql #postgresql #основы