☑️IS NOT NULL + OR
Иногда внутри SQL-запроса возникает необходимость проверить наличие/отсутствие NULL-значения в некотором наборе полей:
a IS NOT NULL OR b IS NOT NULL OR c IS NOT NULL
Но то же самое по смыслу условие можно записать гораздо короче с помощью функции coalesce:
coalesce(a, b, c) IS NOT NULL
☑️IS NOT NULL + AND
Немного изменим условие - заменим
OR на AND:a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL
Тут нам поможет ROW-конструктор:
(a, b, c) IS NOT NULL
☑️IS NULL + AND
Теперь заменим
IS NOT NULL на IS NULL:a IS NULL AND b IS NULL AND c IS NULL
Тут достаточно вспомнить из логики, что
(A and B) эквивалентно not(not A or not B), а (A or B) - not(not A and not B), поэтому легко применяем not к варианту IS NOT NULL + OR:coalesce(a, b, c) IS NULL
Или с помощью ROW-конструктора:
(a, b, c) IS NULL
☑️IS NULL + OR
Остался последний вариант:
a IS NULL OR b IS NULL OR c IS NULL
Тут мы можем "обратить" вариант IS NOT NULL + AND:
NOT (a, b, c) IS NOT NULL
Заметьте, что пара
NOT тут "не сокращается", иначе получился бы предыдущий вариант.Подробнее об особенностях работы со сложными выражениями тут — "PostgreSQL Antipatterns: вычисление условий в SQL". И ещё годная статья — "«Ленивый сахар» PostgreSQL"
@sqlhub
