【问题标题】:Postgresql select json array into rows and single textPostgresql将json数组选择为行和单个文本
【发布时间】:2017-11-10 10:07:11
【问题描述】:

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

SELECT  test_id, content::json->'scenario'
FROM    test

我得到了这些结果,场景列中有对象数组:

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"}]}]

对象结构是这样的:

[{
    "name": "OpenSignal",
    "task": [{
        "name": "speedtest"
    }]
}, {
    "name": "ITest",
    "task": [{
        "name": "speedtest"
    }]
}, {
    "name": "EqualOne",
    "task": [{
        "name": "flashtest"
    }, {
        "name": "web"
    }, {
        "name": "video"
    }]
}]

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

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

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

提前感谢我的兄弟们

【问题讨论】:

标签: arrays json postgresql object


【解决方案1】:

对于您的第一个查询,您可以执行以下操作:

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 函数将其包装在另一个子查询中:

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

【讨论】:

  • umm 很抱歉,但是出现了如下错误消息:“错误:无法在非数组上调用 json_array_elements”。我认为错误是因为我的场景值不是数组类型。您的 sqlfiddle 正在工作,因为您将场景值设置为文本(您在数组中添加单个 qoute)而我的没有单个 qoute。如何将场景转换为数组?
  • 你看我的内容列的类型是json。添加 json 是带引号的,比如这里:postgresqltutorial.com/postgresql-json 我想我可能误解了你的数据格式,但如果你的场景是对象而不是数组,处理它们应该更容易。也许您可以修改小提琴以使数据具有正确的格式?
猜你喜欢
  • 2020-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-08
  • 2012-05-31
  • 2011-10-02
  • 2020-08-30
  • 1970-01-01
相关资源
最近更新 更多