Sql 连接到单个列时对列值排序
如何对列值进行简单的排序 在select中将两列或多列连接到一列时(似乎有一些相关的问题,但不完全是我想要的,并且有太复杂的答案) 考虑以下场景: 有一张像这样的桌子:Sql 连接到单个列时对列值排序,sql,postgresql,Sql,Postgresql,如何对列值进行简单的排序 在select中将两列或多列连接到一列时(似乎有一些相关的问题,但不完全是我想要的,并且有太复杂的答案) 考虑以下场景: 有一张像这样的桌子: DROP TABLE t1; CREATE TABLE t1 ( name varchar, name2 varchar ); 关于数据: INSERT INTO t1 VALUES ('N1', 'N2') ,('N2', 'N1') ; 选择类似: SELECT (name||name2)
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
因此,如果name
和name2
的列值集相同,则id
相同
注意:我意识到这可以通过创建函数/过程来实现,但我想知道是否有一种更标准的方式来实现。这意味着我希望避免安装任何扩展,但不希望它也能在Oracle或MSSQL中工作。您可以使用
CASE
子句来决定:
如果您想要有更多的列,那么更高级的排序机制可能是:将列聚合到一个列中(将它们聚合到一个数组中,并将所有元素聚合到一个公共列中)。此列可以排序并聚合到您的
id
列中:
很难选择被接受的答案。S-Man做了更多的工作,所以我最终去了S-Man的aswer。谢谢
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
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
SELECT (least(name,name2)||greatest(name,name2)) AS id, *
FROM t1
ORDER BY 1 DESC;