是否有一种正确但简短的方法将带有字符串的JSON数组转换为一个字符串?

时间:2018-11-30 15:26:02

标签: postgresql

我想将带有一串字符串的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 _;

这可行,但看起来它并不是最佳解决方案。有更短的方法吗?

1 个答案:

答案 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