我正在访问jsonb字段中的数组(称为‘jsonb’的json对象),并希望将其内容解析为以逗号分隔的文本字段。
SELECT
jsonb_array_elements(doc -> 'form_values' -> '8189' -> 'choice_values')
FROM
field_data.exports;该jsonb_array_elements函数返回一个“文本集”,我希望将其转换为包含在单个字段中的数组值的逗号分隔列表。
谢谢。
发布于 2016-07-20 16:04:40
Set返回函数(如jsonb_array_elements_text())可以在SELECT列表中调用,但是它们不能用于聚合函数。
这是在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;发布于 2016-07-20 06:03:42
使用 aggregate function并从jsonb_array_elements_text中进行子选择似乎是有效的(在PG9.5上进行了测试)。注意jsonb_array_elements_text的使用,它是在PostgreSQL 9.4中添加的,而不是PostgreSQL 9.3中的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'
发布于 2020-03-12 16:32:18
也许不是最佳实践:将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);https://stackoverflow.com/questions/38473345
复制相似问题