Заказ запроса по полю в обратной записи - PullRequest
1 голос
/ 16 января 2012

У меня есть запрос, который вызывает функцию в предложении select. Функция возвращает тип записи. В вызывающем запросе я хочу упорядочить по одному из полей в возвращаемой записи, и, если возможно, я бы также хотел вернуть поля записи как поля вызывающего запроса. Чтобы сделать это понятным, вот упрощенная версия кода:

CREATE OR REPLACE FUNCTION getStatus(lastContact timestamptz, lastAlTime timestamptz, lastGps timestamptz, out status varchar, out toelichting varchar, out colorLevel integer)
    RETURNS record AS
    $BODY$
        BEGIN
            status      := 'controle_status_ok';
            toelichting := '';
            colorLevel  := 3;
        END
    $BODY$
        LANGUAGE 'plpgsql' VOLATILE
        COST 100;
ALTER FUNCTION DMI_Controle_getStatus(timestamptz, timestamptz, timestamptz, out varchar, out varchar, out integer) OWNER TO xyz;

Используя эту функцию, я хочу получить запрос, подобный следующему:

SELECT
    id,
    name,
    getStatus(tabel3.lastcontact, tabel4.lastchanged, tabel5.lastfound) as status
FROM
    tabel1
    left join tabel2 on ...
    left join tabel3 on ...
    left join tabel4 on ...
    left join tabel5 on ...
ORDER BY
    status

Postgres приходит со следующей ошибкой:

ОШИБКА: не удалось определить оператор упорядочения для записи типа

СОВЕТ: используйте явный оператор упорядочения или измените запрос.

Вопрос: как мне упорядочить по значению colorLevel, возвращенному getStatus?

Дополнительный вопрос: могу ли я вернуть три поля функции getStatus в поля запроса, который вызывает функцию getStatus?

1 Ответ

1 голос
/ 16 января 2012

Использование

ORDER BY (status).colorlevel

для ссылки на столбец вашего типа записи.

В качестве отступления: я использовал нижний регистр (colorlevel вместо colorLevel), потому что идентификаторы приводятся к нижнему регистру, если в любом случае не заключаются в двойные кавычки, и использование смешанных идентификаторов вообще плохая идея в PostgreSQL.


Что касается вашего дополнительного вопроса , аналогичное синтаксическое требование. Я также использую подзапрос для оптимизации запроса:

SELECT id
     , name
     , (x.status).status
     , (x.status).toelichting
     , (x.status).colorLevel
FROM   tabel
     , (SELECT getStatus(now(), now(), now()) as status) x
ORDER  BY (x.status).colorlevel

Прочтите о доступе к составным типам в руководстве.


Ответ после дополнительного ввода

Чтобы использовать столбцы из ваших таблиц, поместите все это в подзапрос. Я пытаюсь избежать вызова функции несколько раз, потому что это может быть дорого.

SELECT
    id,
    name,
    (status).status,
    (status).toelichting,
    (status).colorLevel
FROM (
    SELECT
      id,
      name,
      getStatus(tabel3.lastcontact, tabel4.lastchanged, tabel5.lastfound) as status
    FROM
     tabel1
     left join tabel2 on ...
     left join tabel3 on ...
     left join tabel4 on ...
     left join tabel5 on ...
    ) x
ORDER BY
    (status).colorlevel
...