以逗号分隔的列表返回jsonb_array_elements结果

时间:2016-07-20 05:58:09

标签: json postgresql jsonb postgresql-9.5

我正在jsonb字段中访问一个数组(一个名为' choice_values'的json对象),并希望将其内容解析为逗号分隔的文本字段。

SELECT
    jsonb_array_elements(doc -> 'form_values' -> '8189' -> 'choice_values')
FROM
    field_data.exports;

jsonb_array_elements函数返回一个" setof text",我希望将其转换为包含在单个字段中的逗号分隔的数组值列表。

谢谢。

3 个答案:

答案 0 :(得分:3)

可以在SELECT列表中调用设置返回函数(如jsonb_array_elements_text()),但不能在聚合函数中使用它们。

这是在FROM子句中调用set返回函数的一种很好的做法,通常在横向连接中,如下例所示:

with the_data as (
    select '["alfa", "beta", "gamma"]'::jsonb as js
    )

select string_agg(elem, ',')
from 
    the_data, 
    jsonb_array_elements_text(js) elem;

   string_agg    
-----------------
 alfa,beta,gamma
(1 row)     

所以你的查询应该是这样的:

select string_agg(elem, ',')
from 
    field_data.exports, 
    jsonb_array_elements_text(doc -> 'form_values' -> '8189' -> 'choice_values') elem;

答案 1 :(得分:1)

使用来自jsonb_array_elements_text的子选项的string_agg aggregate function似乎有效(在PG 9.5上测试)。注意在PostgreSQL 9.3中使用jsonb_array_elements_text,在PostgreSQL 9.4中添加,而不是jsonb_array_elements

with exports as (
    select $${"form_values": {"8189": {"choice_values": ["a","b","c"]}}}$$::jsonb as doc
)
SELECT
    string_agg(values, ', ')
FROM
    exports, jsonb_array_elements_text(doc -> 'form_values' -> '8189' -> 'choice_values') values
GROUP BY
    exports.doc;

输出:

'a, b, c'

另见this question and its answers

答案 2 :(得分:0)

也许不是最佳实践:将json数组转换为文本,然后除去括号。

WITH input AS (
    SELECT '["text1","text2","text3"]'::jsonb as data
) 
SELECT substring(data::text,2,length(data::text)-2) FROM input

它的优点是可以“就地”转换,而不是通过汇总转换。如果您只能访问部分查询,例如对于某些具有基于字段的转换规则或以下内容的同步工具:

CREATE TEMP TABLE example AS (SELECT '["text1","text2","text3"]'::jsonb as data);
ALTER TABLE example ALTER COLUMN data TYPE text USING substring(data::text,2,length(data::text)-2);