Postgresql помещает строки в кавычки с помощью array_to_string

В select я использовал array_to_string вот так (пример)

array_to_string(array_agg(tag_name),';') tag_names

Я получил результирующую строку "tag1;tag2;tag3;..." но я хотел бы получить результирующую строку как "'tag1';'tag2';'tag3';...",

Как я могу сделать это в Postgres?

4 ответа

Решение

Использование string_agg() а также format() функции, например

with my_table(tag_name) as (
values 
    ('tag1'),
    ('tag2'),
    ('tag3')
)

select string_agg(format('''%s''', tag_name), ';' order by tag_name) tag_names
from my_table;

      tag_names       
----------------------
 'tag1';'tag2';'tag3'
(1 row)

Или вы можете использовать unnest, format, array_agg а также array_to_string в одном запросе так:

select array_to_string(t.tag, ',')  
from (  
    select array_agg(format('%L', t.tag)) as tag  
    from (  
        select unnest(tag_name) as tag  
    ) t  
) t;

Или использовать

array_to_string(array_agg(''''||tag_name||''''),';') tag_names 

или даже проще (спасибо за комментирование:))

string_agg(''''||tag_name||''''),';') tag_names 

Замечания:

При работе с агрегатными функциями с несколькими аргументами обратите внимание, что предложение ORDER BY идет после всех аргументов агрегирования. Например, напишите это:

ВЫБЕРИТЕ string_agg(a, ',' ORDER BY a) FROM table;

не это:

ВЫБЕРИТЕ string_agg (ORDER BY a, ',') FROM table; - неверно

См. https://www.postgresql.org/docs/current/static/sql-expressions.html.

Вы можете использовать string_agg()функция с '''; '''так что будет как

      SELECT string_agg(tag_name, '''; ''') from my_table
Другие вопросы по тегам