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Подробнее об особенностях работы со сложными выражениями можно прочитать в статье "PostgreSQL Antipatterns: вычисление условий в SQL".
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 NULLIS 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Разница будет заключаться в том, что
coalesceвычисляет выражения "лениво" (см. "«Ленивый сахар» PostgreSQL").
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 тут "не сокращается", иначе получился бы предыдущий вариант.
