如何对列值进行简单排序在选择中将两列或多列连接到一列时(似乎没有什么相关的问题,但不完全是我想要的,而且答案太复杂了(?
考虑以下场景:
有一张类似的桌子
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