首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将json数组选择为行和单个文本

问将json数组选择为行和单个文本
EN

Stack Overflow用户
提问于 2017-11-10 10:07:11
回答 1查看 6.3K关注 0票数 4

我有这样的查询要从表中获得结果:

代码语言:javascript
复制
SELECT  test_id, content::json->'scenario'
FROM    test

通过场景列中的对象数组,我得到了以下结果:

代码语言:javascript
复制
test_id | scenario
29      | [{"name":"OpenSignal", "task":[{"name":"speedtest"}]}, {"name":"ITest", "task":[{"name":"speedtest"}]}, {"name":"EqualOne", "task":[{"name":"flashtest"}, {"name":"web"}, {"name":"video"}]}]
30      | [{"name":"Speedtest", "task":[{"name":"speedtest"}]}, {"name":"ITest", "task":[{"name":"speedtest"}]}, {"name":"EqualOne", "task":[{"name":"flashtest"}, {"name":"web"}, {"name":"video"}]}]

对象结构如下:

代码语言:javascript
复制
[{
    "name": "OpenSignal",
    "task": [{
        "name": "speedtest"
    }]
}, {
    "name": "ITest",
    "task": [{
        "name": "speedtest"
    }]
}, {
    "name": "EqualOne",
    "task": [{
        "name": "flashtest"
    }, {
        "name": "web"
    }, {
        "name": "video"
    }]
}]

我怎样才能得到这样的结果:

代码语言:javascript
复制
test_id | scenario
29      | Opensignal-speedtest
29      | ITest-speedtest
29      | EqualOne-flashtest
29      | EqualOne-web
29      | EqualOne-video
30      | Opensignal-speedtest
30      | ITest-speedtest
30      | EqualOne-flashtest
30      | EqualOne-web
30      | EqualOne-video

和

代码语言:javascript
复制
test_id | scenarios
29      | OpenSignal-speedtest,ITest-speedtest,EqualOne-flashtest, EqualOne-web,EqualOne-video
30      | Speedtest-speedtest,ITest-speedtest,EqualOne-flashtest,EqualOne-web,EqualOne-video

提前感谢我的兄弟们

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-10 12:31:20

对于第一个查询,您可以这样做:

代码语言:javascript
复制
SELECT test_id, CONCAT(sub.element->'name', '-', json_array_elements(sub.element->'task')->'name') as scenario
FROM 
  (SELECT test_id, json_array_elements(content::json) as element 
   FROM test) as sub;

我使用子查询从原始的json中获取元素,然后用破折号将名称与每个任务名连接起来。

然后,为了方便地在每个id中分离它们,我使用string_agg函数将其封装在另一个子查询中:

代码语言:javascript
复制
SELECT test_id, 
       string_agg(task, ',')
FROM(
    SELECT test_id, CONCAT(sub.element->'name', '-', json_array_elements(sub.element->'task')->'name') as task
    FROM 
      (SELECT test_id, json_array_elements(content::json) as element 
       FROM test) as sub
)as tasks 
 GROUP BY test_id

对不起,如果它看起来有点混乱,这里有一个sqlfiddle链接,您可以使用。http://sqlfiddle.com/#!17/fcb27/38

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47220253

复制
相关文章

相似问题

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