упорядочить значения, разделенные запятыми, в строке в Postgresql

#string #postgresql #sql-order-by #postgresql-9.1 #greenplum

#строка #postgresql #sql-order-by #postgresql-9.1 #greenplum

Вопрос:

Есть ли какой-либо способ изменить порядок значений строки в порядке возрастания или убывания?

т.е. значения: u,a, c,от a до a,a,c,u

Комментарии:

1. Почему вы храните несколько значений в одном поле? Это путь к проблемам

Ответ №1:

Вы можете сделать это, выполнив unnest в вашей строке, чтобы разбить значения на несколько строк, а затем сгруппировать по ним

Получение результатов в порядке возрастания

 WITH cte AS (
        SELECT id, unnest(string_to_array(str, ',')) as str
        FROM test_string
        order by 1,2 
     )
select ID, string_agg(str,',') final_string  
from cte 
group by id
order by final_string ;
 

введите описание изображения здесь

Получение результатов в порядке убывания

 WITH cte AS (
        SELECT id, unnest(string_to_array(str, ',')) as str
        FROM test_string
        order by 1,2 desc
     )
select ID, string_agg(str,',') final_string  
from cte 
group by id
order by final_string desc;
 

введите описание изображения здесь

Вы можете использовать следующий код для воспроизведения сценария.

     drop table if exists test_string;
create table test_string (id integer, str varchar(100));

insert into test_string (id, str) values (1, 'q,w,r');
insert into test_string (id, str) values (2, 'a,e,c');
insert into test_string (id, str) values (3, 'a,z,e');       
        
-- Getting results in ASC order
WITH cte AS (
        SELECT id, unnest(string_to_array(str, ',')) as str
        FROM test_string
        order by 1,2 
     )
select ID, string_agg(str,',') final_string  
from cte 
group by id
order by final_string ;

-- Getting results in DESC order
WITH cte AS (
        SELECT id, unnest(string_to_array(str, ',')) as str
        FROM test_string
        order by 1,2 desc
     )
select ID, string_agg(str,',') final_string  
from cte 
group by id
order by final_string desc;