代码之家  ›  专栏  ›  技术社区  ›  pirho

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

  •  2
  • pirho  · 技术社区  · 7 年前

    在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中也能工作。

    2 回复  |  直到 7 年前
        1
  •  1
  •   S-Man    7 年前

    你可以用一个 CASE

    demo: db<>fiddle

    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

    demo: db<>fiddle

    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
    
        2
  •  2
  •   LoztInSpace    7 年前
    SELECT (least(name,name2)||greatest(name,name2)) AS id, *
    FROM t1
    ORDER BY 1 DESC;