Есть ли правильный, но короткий способ превратить массив JSON со строками в одну строку? - PullRequest
0 голосов
/ 30 ноября 2018

Я хочу превратить массив JSON с кучей строк в одну строку.Ниже приведен не массив JSON, но ожидаемый результат для ['a', 'b'] и работает:

select array_to_string(array['a', 'b'], ',');

 array_to_string 
═════════════════
 a,b

Это не работает:

select array_to_string('{"key": ["a", "b"]}'::json ->> 'key', ',');

Тогда я нашел это :

select
    string_agg(_, ',')
from 
    json_array_elements_text('{"key": ["a", "b"]}'::json -> 'key') as _;

Это работает, но, похоже, не может быть лучшим решением.Есть ли более короткий способ сделать это?

1 Ответ

0 голосов
/ 30 ноября 2018

Используйте JSON_ARRAY_ELEMENTS_TEXT, чтобы расширить его до набора значений TEXT, затем STRING_AGG их.

SELECT STRING_AGG(j, ',')
FROM JSON_ARRAY_ELEMENTS_TEXT('{"key": ["a", "b"]}'::JSON->'key') AS j

Бит с TRIM, который вы разместили в своем вопросе, требовался в 9.3 и ниже.потому что JSON_ARRAY_ELEMENTS_TEXT не было доступно в этих версиях.

Если вы хотите решение с одной функцией, вы всегда можете заключить вышеуказанный запрос в функцию:

CREATE OR REPLACE FUNCTION json_array_to_text(json_array JSON)
    RETURNS TEXT AS
$BODY$
    SELECT STRING_AGG(j, ',')
    FROM JSON_ARRAY_ELEMENTS_TEXT(json_array) AS j;
$BODY$
    LANGUAGE SQL IMMUTABLE;

Затем вы просто вызываетефункция с массивом: SELECT json_array_to_text('{"key": ["a", "b"]}'::JSON->'key')

и получить: a,b

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...