首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >以逗号分隔列表的形式返回jsonb_array_elements结果

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

Stack Overflow用户
提问于 2016-07-20 05:58:09
回答 3查看 10.8K关注 0票数 7

我正在访问jsonb字段中的数组(称为‘jsonb’的json对象),并希望将其内容解析为以逗号分隔的文本字段。

代码语言:javascript
运行
复制
SELECT
    jsonb_array_elements(doc -> 'form_values' -> '8189' -> 'choice_values')
FROM
    field_data.exports;

该jsonb_array_elements函数返回一个“文本集”,我希望将其转换为包含在单个字段中的数组值的逗号分隔列表。

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-07-20 16:04:40

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

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

代码语言:javascript
运行
复制
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)     

因此,您的查询应该如下所示:

代码语言:javascript
运行
复制
select string_agg(elem, ',')
from 
    field_data.exports, 
    jsonb_array_elements_text(doc -> 'form_values' -> '8189' -> 'choice_values') elem;
票数 7
EN

Stack Overflow用户

发布于 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

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2020-03-12 16:32:18

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

代码语言:javascript
运行
复制
WITH input AS (
    SELECT '["text1","text2","text3"]'::jsonb as data
) 
SELECT substring(data::text,2,length(data::text)-2) FROM input

它的优点是它可以转换“就地”,而不是通过聚合。如果您只能访问查询的一部分,例如某些具有基于字段的转换规则的同步工具,或者类似于以下内容,这将非常方便:

代码语言:javascript
运行
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38473345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档