мне нужно создать процедуру с необязательными аргументами и использовать их, только если они не равны нулюДополнительные условия в запросе PostGreSQL
Мой текущий запрос выглядит следующим образом:
SELECT * FROM sth WHERE
(arg1 IS NULL OR sth.c1 = arg1) AND
(arg2 IS NULL OR sth.c2 = arg2) AND
(arg3 IS NULL OR sth.c3 > arg3) AND
(arg4 IS NULL OR sth.c4 < arg4)
Я думаю так, чтобы он выглядел лучше/короче. Мой первый выстрел:
SELECT * FROM sth WHERE
COALESCE(sth.c1 = arg1, 't') AND
COALESCE(sth.c2 = arg2, 't') AND
COALESCE(sth.c3 > arg3, 't') AND
COALESCE(sth.c4 < arg4, 't');
, но я не уверен, если это выглядит лучше. Знаете ли вы какие-нибудь полезные приемы для этого?
'' что-то = something'' либо '' true'' или ' 'false'', а не NULL – nrathaus
@nrathaus:' anything = NULL' is null – Adassko
Первая форма, вероятно, понятна и позволяет оптимизатору полностью вырезать выражения, доказав, что другая сторона 'OR' всегда истинна. Хотя планировщик может доказать, что '[anything] = NULL' всегда' NULL' тоже; Я не проверял; вы должны быть в состоянии сказать в 'explain' output. –