连接到单个列时对列值进行排序



如何对列值进行简单排序在选择中将两列或多列连接到一列时(似乎没有什么相关的问题,但不完全是我想要的,而且答案太复杂了(?

考虑以下场景:

有一张类似的桌子

DROP TABLE t1;
CREATE TABLE t1 (
name varchar,
name2 varchar
);

带数据:

INSERT INTO t1 VALUES
('N1', 'N2')
,('N2', 'N1')
;

选择类似:

SELECT (name||name2) AS id, * from t1;

结果为:

id  | name | name2      
------+------+-------  
N1N2 | N1   | N2    
N2N1 | N2   | N1     

我希望后一行N1N2而不是N2N1。所以我想要的是:

SELECT (concat(sort(name,name2))) AS id, * from t1 ;

应导致:

id  | name | name2      
------+------+-------  
N1N2 | N1   | N2    
N1N2 | N2   | N1     

因此如果CCD_ 3&CCD_ 4是相同的,则CCD_。

注意:我意识到这可以通过创建一个函数/过程来实现,但我想知道是否有更Postgres的标准方法来实现。这意味着我希望避免安装任何扩展,但不希望它也能在Oracle或MSSQL中工作。

SELECT (least(name,name2)||greatest(name,name2)) AS id, *
FROM t1
ORDER BY 1 DESC;

您可以用CASE子句来决定:

演示:db<>小提琴

SELECT 
CASE 
WHEN name <= name2 THEN name || name2 
ELSE name2 || name 
END as id,
name,
name2
FROM t1

结果:

id     name    name2
N1N2   N1      N2
N1N2   N2      N1

如果您想要更多的列,一种更高级的排序机制可以是:将列聚合为一列(将它们聚合为一个数组,并将unnest所有元素聚合为一公共列(。此列可以排序并聚合到您的id列中:

演示:db<>小提琴

SELECT 
array_to_string(array_agg(all_columns ORDER BY all_columns), '') as ids,
name, name2, name3, name4
FROM (
SELECT 
unnest(ARRAY[name, name2, name3, name4]) as all_columns,
name, name2, name3, name4
FROM t2
) s
GROUP BY name, name2, name3, name4

最新更新