由复合型Postgres会员订购

时间:2014-07-15 19:01:35

标签: sql postgresql casting

参见下表:

CREATE TABLE test(id serial primary key, txt text);
INSERT INTO test (id,txt) values (1,'one'),(2,'two'),(3,'three')

和自定义类型:

CREATE TYPE tttpe AS (id integer, name varchar(32), greee integer);

我正在转换这样的查询:

SELECT id, txt, (id+10) as gree FROM test ORDER BY 2

其中2是动态的,对于这样的查询:

SELECT (id, txt, (id+10))::tttpe FROM test;  --order  by!?

但我想通过自定义类型的成员订购,例如txt.我该怎么做?理想情况下,我希望能够为第n个属性使用整数索引,但如果不可能,我可以解决它。

更新:

基于Clodoaldo Neto 答案我想出了以下内容:

SELECT (id,txt,g)::tttpe FROM (select id, txt, (id+10) FROM test ORDER BY 2) AS s;

虽然在实践中我有40多个字段,所以不得不将它们列出两次是一种痛苦。

1 个答案:

答案 0 :(得分:1)

select (tt).id, (tt).name, (tt).greee, tt
from (
    select (id, txt, id+10)::tttpe as tt
    from test
) s
order by 3 desc

没有子选择

select
    ((id, txt, id+10)::tttpe).id,
    ((id, txt, id+10)::tttpe).name,
    ((id, txt, id+10)::tttpe).greee,
    (id, txt, id+10)::tttpe as tt
from test
order by 3 desc

由于评论中非常重要的上下文更改而进行编辑

在函数或子选择内部完成的排序不保证是其输出之一,因此不要在它们内部排序。但好消息是,从函数

访问该类型的每个成员要容易得多
create or replace function get_tt()
returns tttpe as $$
    select (id, txt, id+10)::tttpe as tt
    from test;
$$ language sql;

select id, name, greee
from get_tt()
order by 3 desc;

但是如果您想要原始对象,请参阅下面的查询,那么您将回到原点

select get_tt();