Sql 连接到单个列时对列值排序

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)

如何对列值进行简单的排序 在select中将两列或多列连接到一列时(似乎有一些相关的问题,但不完全是我想要的,并且有太复杂的答案)

考虑以下场景:

有一张像这样的桌子:

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;