【问题标题】:Extract fields from postgres jsonb column从 postgres jsonb 列中提取字段
【发布时间】:2019-11-20 23:09:00
【问题描述】:

我有一个带有 jsonb 列的 postgres 表,其值如下:

 id  |  messageStatus       |   payload
-----|----------------------|-------------
1    |    123               | {"commissionEvents":[{"id":1,"name1":"12","name2":15,"name4":"apple","name5":"fruit"},{"id":2,"name1":"22","name2":15,"name4":"sf","name5":"fdfjkd"}]}
2    |    124               | {"commissionEvents":[{"id":3,"name1":"32","name2":15,"name4":"sf","name5":"fdfjkd"},{"id":4,"name1":"42","name2":15,"name4":"apple","name5":"fruit"}]}
3    |    125               | {"commissionEvents":[{"id":5,"name1":"42","name2":15,"name4":"apple","name5":"fdfjkd"},{"id":6,"name1":"52","name2":15,"name4":"sf","name5":"fdfjkd"},{"id":7,"name1":"62","name2":15,"name4":"apple","name5":"fdfjkd"}]}

这里的payload列是jsonb数据类型,我想写一个postgres查询来从commissionEvents中获取name1,其中name4 = apple。

所以我的结果会是这样的:

由于我是这个 jsonb 的新手,任何人都可以建议我一些解决方案。

【问题讨论】:

    标签: sql postgresql jsonb


    【解决方案1】:

    您需要取消嵌套所有数组元素,然后您可以对其应用 WHERE 条件以过滤掉具有所需名称的元素。

    select t.id, x.o ->> 'name1'
    from the_table t
      cross join lateral jsonb_array_elements(t.payload -> 'commissionEvents') as x(o)
    where x.o ->> 'name4' = 'apple'
    

    在线示例:https://rextester.com/XWHG26387

    【讨论】:

    • 它返回“没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。SQL 状态:42883 字符:93”错误在“=”符号
    • 啊,不清楚是否涉及数组。查看我的编辑
    猜你喜欢
    • 2016-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 2015-10-06
    • 2020-04-09
    • 1970-01-01
    相关资源
    最近更新 更多