postgresql: упрощение sql запроса в хранимке
есть у меня такая хранимая функция:
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;
и вот он как раз работает некорректно - есть ли условие в параметрах функции или нет код выполняется всегда так как будто никакого условия нет
подскажите почему так произошло и как можно исправить, может запрос вообще по другому стоит написать?
Источник: Stack Overflow на русском