PostgreSQL实现自定义tuple类型数组按op字段排序的函数问题
解决自定义Tuple数组按op字段排序的问题
嘿,我明白你的问题了——你之前写的array_sort函数之所以没达到预期,是因为它在排序时用的是整个tuple的默认比较规则,而不是你需要的op字段。咱们来调整一下函数,让它精准按op来排序。
问题根源
原来的函数ORDER BY 1 desc是把整个tuple当作排序键,而tuple的默认排序是先比对id再比对op,这显然不是你想要的逻辑。我们需要明确提取tuple里的op字段作为排序依据。
修正后的函数
下面这个函数专门针对你的tuple类型数组,按op字段降序排序:
CREATE OR REPLACE FUNCTION array_sort_by_op(tuple[]) RETURNS tuple[] LANGUAGE SQL AS $$ SELECT ARRAY( SELECT unnest($1) ORDER BY (unnest).op DESC ); $$;
如果你的op字段存储的是数字字符串(比如例子里的"666"、"777"),想要按数值大小排序而不是字符串字典序的话,可以把op转成整数再排序:
CREATE OR REPLACE FUNCTION array_sort_by_op(tuple[]) RETURNS tuple[] LANGUAGE SQL AS $$ SELECT ARRAY( SELECT unnest($1) ORDER BY (unnest).op::integer DESC ); $$;
使用示例
假设你的表名为your_table,执行下面的查询就能得到你想要的结果:
SELECT country, array_sort_by_op(tuple) AS tuple FROM your_table;
执行后你会看到:
- USA的tuple数组会按
op从高到低排序为{"(2,777)","(3,222)"} - India的tuple数组排序为
{"(4,555)","(2,444)"} - England的tuple数组因为
666>333,结果和原表一致,符合预期
内容的提问来源于stack exchange,提问作者Shay Zambrovski
相关产品推荐
相关产品推荐

