Сортировать строки / слова в алфавитном порядке через запятую в столбце в SQL (весь столбец) - PullRequest
0 голосов
/ 29 августа 2018

Допустим, у меня есть таблица следующих данных: (таких строк больше 1000)

Bird  
----------------------------
Sparrow, Eagle, Crow
Woodpecker, Sparrow
Crow, Eagle                     
etc. etc.

Я хочу, чтобы последний столбец был отсортирован по алфавиту. Примерно так:

Bird  
--------------------
Crow, Eagle, Sparrow
Sparrow, Woodpecker   
Crow, Eagle                    
etc. etc.

Нужно знать SQL-запрос, который может это сделать. Возможно, SQL Developer.

1 Ответ

0 голосов
/ 29 августа 2018

Вот решение Oracle, использующее Common Table Expressions (CTE) для решения проблемы. Не уверен, поможет ли это, но, возможно, это даст вам идею или отправную точку, которую вы сможете применить в своей среде.

SQL> -- Set up original data set
SQL> with bird_tbl(id, unsorted_list) as (
     select 1, 'Sparrow, Eagle, Crow' from dual union all
     select 2, 'Woodpecker, Sparrow' from dual union all
     select 3, 'Crow, Eagle' from dual
   ),
   -- Split the list into a row for each element
   split_tbl(id, bird) as (
     select id, regexp_substr(unsorted_list, '(.*?)(, |$)', 1, level, null, 1)
     from bird_tbl
     connect by level <= regexp_count(unsorted_list, ', ')+1
       and prior id = id
       and prior sys_guid() is not null
   )
   -- select * from split_tbl;
   -- Rebuild the sorted row
   select id, listagg(bird, ', ')
     within group (order by bird) sorted_list
     from split_tbl
     group by id;

        ID SORTED_LIST
---------- --------------------
         1 Crow, Eagle, Sparrow
         2 Sparrow, Woodpecker
         3 Crow, Eagle

РЕДАКТИРОВАТЬ: Вот как применить к вашей ситуации. Просто замените <your_primary_key> на имя столбца первичного ключа, <your_column_name> на имя столбца, который содержит несортированный список, и <your_table_name> на имя таблицы.

with split_tbl(<your_primary_key>, <your_column_name>) as (
     select <your_primary_key>, regexp_substr(<your_column_name>, '(.*?)(, |$)', 1, level, null, 1)
     from <your_table_name>
     connect by level <= regexp_count(<your_column_name>, ', ')+1
       and prior <your_primary_key> = <your_primary_key>
       and prior sys_guid() is not null
   )
   -- select * from split_tbl;
   -- Rebuild the sorted row
   select <your_primary_key>, listagg(<your_column_name>, ', ')
     within group (order by <your_column_name>) sorted_list
     from split_tbl
     group by <your_primary_key>;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...