我想将带有一串字符串的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', ',');
然后我发现了this:
select
string_agg(_, ',')
from
json_array_elements_text('{"key": ["a", "b"]}'::json -> 'key') as _;
这可行,但看起来它并不是最佳解决方案。有更短的方法吗?
答案 0 :(得分:0)
使用JSON_ARRAY_ELEMENTS_TEXT
将其扩展为一组TEXT值,然后将其STRING_AGG
扩展。
SELECT STRING_AGG(j, ',')
FROM JSON_ARRAY_ELEMENTS_TEXT('{"key": ["a", "b"]}'::JSON->'key') AS j
在9.3及更低版本中,您需要在问题中添加带有TRIM
的位,因为在这些版本中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