我有一个在其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函数的三个字段吗?
答案 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