我正在jsonb
字段中访问一个数组(一个名为' choice_values'的json对象),并希望将其内容解析为逗号分隔的文本字段。
SELECT
jsonb_array_elements(doc -> 'form_values' -> '8189' -> 'choice_values')
FROM
field_data.exports;
jsonb_array_elements函数返回一个" setof text",我希望将其转换为包含在单个字段中的逗号分隔的数组值列表。
谢谢。
答案 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'
答案 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);