У меня есть sql-функция, которая выполняет простой sql-оператор select:
CREATE OR REPLACE FUNCTION getStuff(param character varying)
RETURNS SETOF stuff AS
$BODY$
select *
from stuff
where col = $1
$BODY$
LANGUAGE sql;
Сейчас я вызываю эту функцию следующим образом:
select * from getStuff('hello');
Какие у меня есть варианты, если мне нужно упорядочить и ограничить результаты с помощью упорядочить предложениями
и limit
?
Думаю, такой запрос:
select * from getStuff('hello') order by col2 limit 100;
не будет очень эффективным, потому что все строки из таблицы материал
будет возвращен функцией getStuff
и только затем упорядочен и нарезан по пределу.
Но даже если я прав, нет простого способа передать порядок аргументом функции языка sql. Можно передавать только значения, а не части оператора sql.
Другой вариант - создать функцию на языке plpgsql
, где можно построить запрос и выполнить его через EXECUTE
. Но это тоже не очень хороший подход.
Итак, есть ли другой способ добиться этого? Или какой вариант вы бы выбрали? Упорядочивание / ограничение вне функции или plpgsql?
Я использую postgresql 9.1.
Я изменил оператор CREATE FUNCTION следующим образом:
CREATE OR REPLACE FUNCTION getStuff(param character varying, orderby character varying)
RETURNS SETOF stuff AS
$BODY$
select t.*
from stuff t
where col = $1
ORDER BY
CASE WHEN $2 = 'parent' THEN t.parent END,
CASE WHEN $2 = 'type' THEN t."type" END,
CASE WHEN $2 = 'title' THEN t.title END
$BODY$
LANGUAGE sql;
Это вызывает:
ОШИБКА: переменные CASE-символы и целое число не могут быть сопоставлены ÁDKA 13: WHEN $ 1 = 'parent' ТОТ t.parent
Таблица stuff
выглядит так:
CREATE TABLE stuff
(
id integer serial,
"type" integer NOT NULL,
parent integer,
title character varying(100) NOT NULL,
description text,
CONSTRAINT "pkId" PRIMARY KEY (id),
)
Я плохо прочитал код Демса.Я исправил это на вопрос. Этот код у меня работает.