参见下表:
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多个字段,所以不得不将它们列出两次是一种痛苦。
答案 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();