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 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
Разница будет заключаться в том, что
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
тут "не сокращается", иначе получился бы предыдущий вариант.