postresql: использование IF THEN ELSE в DECLARE блоке функции
есть функция в которой формируется динамически sql для двух вариантов входного параметра - строка, содержащая начинку WHERE, и пустая строка:
код упростил, чтоб тут не захламлять:
DECLARE
selected_t TEXT := '
WITH selected_t AS (
SELECT *
FROM
mytable_t ' || WHERE $1 || '
)';
sql1 TEXT := 'SELECT * FROM selected_t';
sql2 TEXT := 'SELECT * FROM mytable_t';
BEGIN
IF $1 = '' THEN
RETURN QUERY EXECUTE sql2
USING expr_where;
ELSE
RETURN QUERY EXECUTE selected_t || sql1
USING expr_where;
END IF;
END;
Чтоб избавиться от дублирования довольно большого кода хотелось бы формирование sql полностью перенести в DECLATE
.
Попробовал IF THEN ENDIF
в DECLARE
, но валятся ошибки или это невозможно и в DECLARE
я могу только объявить какие-то переменные и инициализировать их без всяких условий, а все условия уже в блоке BEGIN END
?
P.S. вот такой код не работает
выдаётся ошибка
ERROR: query string argument of EXECUTE is null
CONTEXT: PL/pgSQL function func_dbg(text) line 80 at RETURN QUERY
SQL state: 22004
В чем может быть дело?
Источник: Stack Overflow на русском