在返回记录中的字段上排序查询

时间:2012-01-16 09:28:00

标签: postgresql record plpgsql

我有一个在其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出现以下错误:

  

错误:无法识别类型记录的排序运算符

     

提示:使用显式排序运算符或修改查询。

问题:我应该如何通过getStatus返回的colorLevel的值进行排序?

其他问题:我可以在调用getStatus函数的查询字段中返回getStatus函数的三个字段吗?

1 个答案:

答案 0 :(得分:1)

使用

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

阅读手册中的accessing composite types


在额外输入后回答

要使用表中的列,请将其全部放在子查询中。我试图避免多次调用该函数,因为这可能很昂贵。

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