Что сказал a_horse. И:
Плюс , чтобы динамически выбрать столбец для ORDER BY
, вы должны добавить этот столбец в список SELECT
вашего CTE, что приводит к осложнениям, если столбец может быть продублирован (как при передаче'id') ...
Еще лучше, полностью удалить CTE .В любом случае, в вашем вопросе нет ничего, что могло бы гарантировать его использование.(Используйте CTE только тогда, когда необходимо в Postgres, они обычно медленнее, чем эквивалентные подзапросы или простые запросы.)
CREATE OR REPLACE FUNCTION get_data(p_sort_column text)
RETURNS TABLE (id integer) AS
$func$
BEGIN
RETURN QUERY EXECUTE format(
$q$
SELECT t2.id -- assuming you meant t2?
FROM table_two t2
JOIN table_three t3 on ...
ORDER BY t2.%I DESC NULL LAST -- see below!
$q$, $1);
END
$func$ LANGUAGE plpgsql;
Я добавил NULLS LAST
- вы, вероятно, тоже этого захотите:
Если p_sort_column
все время находится в одной и той же таблице, жесткий кодэто имя таблицы / псевдоним в предложении ORDER BY
.Иначе, передайте имя таблицы / псевдоним отдельно и автоматически заключите их в кавычки для безопасности:
Предлагаю квалифицировать в таблице все имена столбцов в большем запросе с несколькими объединениями (t2.id
, а не только id
).Предотвращает различные неожиданные результаты / путаницу / злоупотребления.
И вы можете захотеть квалифицировать схемы именами таблиц (myschema.table_two
), чтобы избежать подобных проблем при вызове функции с другим search_path
: