postgresql: упрощение sql запроса в хранимке

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

есть у меня такая хранимая функция:

CREATE OR REPLACE FUNCTION get_stats(
    tbl text,
    field text,
    expr_where text DEFAULT ''::text)
    RETURNS TABLE(count bigint, value integer) 
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE PARALLEL UNSAFE
    ROWS 1000

AS $BODY$

DECLARE
    
    sql2 TEXT := '
    WITH selected_t AS (
        SELECT *
        FROM
            ' || tbl || ' ' || expr_where || '
    )
    SELECT 
        COUNT(*) AS count, ' || field || '::integer AS value
    FROM
        selected_t
    GROUP BY ' || field;
    
    sql TEXT := '
    SELECT 
        COUNT(*) AS count, ' || field || '::integer AS value
    FROM
        ' || $1 || '
    GROUP BY ' || field;
    
BEGIN   

    IF expr_where = '' THEN
        RETURN QUERY EXECUTE sql
        USING tbl;
    ELSE
        RETURN QUERY EXECUTE sql2
        USING 'selected_t';
    END IF;
    
END;

указав название таблицы, поле и условие можно получить статистику по кол-ву сущностей в указанном поле, всё работает, всё ок

хотелось бы его сделать более компактным, при этом сохранить читаемость (ну и производительность, т.е. чего-то лишнего не добавлять), сделал такой запрос:

DECLARE
    
    selected_t TEXT := '
    WITH selected_t AS (
        SELECT *
        FROM
            ' || tbl || ' ' || expr_where || '
    )';
    
    sql TEXT := '
    SELECT 
        COUNT(*) AS count, ' || field || '::integer AS value
    FROM
        ' || $1 || '
    GROUP BY ' || field;
    
BEGIN   

    IF expr_where = '' THEN
        RETURN QUERY EXECUTE sql
        USING tbl;
    ELSE
        RETURN QUERY EXECUTE selected_t || sql
        USING 'selected_t';
    END IF;
    
END;

и вот он как раз работает некорректно - есть ли условие в параметрах функции или нет код выполняется всегда так как будто никакого условия нет

подскажите почему так произошло и как можно исправить, может запрос вообще по другому стоит написать?

Ответы

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