Упорядочение значений столбцов при объединении в один столбец - PullRequest
0 голосов
/ 03 ноября 2018

Как сделать простой вид сортировки для значений столбцов при объединении двух или более столбцов в один столбец в выборке (похоже, мало связанных вопросов, но не совсем то, что я хочу, и слишком сложные ответы)?

Рассмотрим следующий сценарий:

Имея стол вроде:

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     

, поэтому, если SET значений столбцов name & name2 одинаков, то id совпадает.

ПРИМЕЧАНИЕ : Я понимаю, что этого можно было бы достичь, создав функцию / процедуру, но я хочу знать, есть ли более стандартный Postgres способ сделать это. Это означает, что я хотел бы избежать установки каких-либо расширений или около того, но не так, чтобы они работали также в Oracle или MSSQL.

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018
SELECT (least(name,name2)||greatest(name,name2)) AS id, *
FROM t1
ORDER BY 1 DESC;
0 голосов
/ 03 ноября 2018

Вы можете решить с помощью CASE предложения:

демо: дБ <> скрипка

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:

демо: дБ <> скрипка

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...