Параметризованный порядок / ограничение PostgreSQL в табличной функции

У меня есть 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),
    )

Edit2

Я плохо прочитал код Демса.Я исправил это на вопрос. Этот код у меня работает.

16
задан Erwin Brandstetter 17 November 2011 в 02:41
поделиться