postresql: использование IF THEN ELSE в DECLARE блоке функции

Рейтинг: 0Ответов: 0Опубликовано: 13.04.2023

есть функция в которой формируется динамически 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. вот такой код не работает

https://dbfiddle.uk/Y9Puo177

выдаётся ошибка

ERROR:  query string argument of EXECUTE is null
CONTEXT:  PL/pgSQL function func_dbg(text) line 80 at RETURN QUERY
SQL state: 22004

В чем может быть дело?

Ответы

Ответов пока нет.