【问题标题】:select column of JSON arrays and show elements as new columns选择 JSON 数组的列并将元素显示为新列
【发布时间】:2020-04-25 14:15:07
【问题描述】:

我有一个 Postgres 数据库,其中有一列包含一个 JSON 数组,用于表示每行中的值。

例子:

id | json_data
1  | [{"sub_id":"a1", "flag":"true", "type":"something"}, {"sub_id":"a2", "flag":"true", "type":"something"}]
2  | [{"sub_id":"b1", "flag":"false", "type":"something"}, {"sub_id":"b2", "flag":"false", "type":"something"}]
3  | [{"sub_id":"c1", "flag":"true", "type":"something"}]

我希望能够创建一个新视图,以便与结构如下的数据进行交互:

id | sub_id | flag  | type
1  | a1     | true  | something
1  | a2     | true  | something
2  | b1     | false | something
2  | b2     | false | something
3  | c1     | true  | something

也许我从 Postgres 文档中无法理解某些内容。似乎我需要利用json_array_elements,但我看到的所有文档和相关示例都显示 JSON 作为字符串传递给此函数。

我该如何为给定列的每一行使用它?

【问题讨论】:

    标签: arrays json postgresql


    【解决方案1】:

    您需要使用jsonb_array_elements取消嵌套,然后您可以访问每个密钥:

    select t.id, 
           j.e ->> 'sub_id' as sub_id,
           j.e ->> 'flag' as flag,
           j.e ->> 'type' as type
    from the_table t
      cross join jsonb_array_elements(t.json_data::jsonb) as j(e)
    order by t.id;
    

    这假设您的列被定义为jsonb(它应该是)。如果只是json,则需要使用json_array_elements()

    【讨论】:

    • 感谢您的回复。我很难理解这里使用的约定,我们定义了“t”、“j”、“e”和“the_table”。我假设 t = 我正在查询的表的名称。 “j”的预期值是多少? “the_table”是否只是一个临时创建的“虚拟”表,以便它可以包含在交叉连接中?对于这些简单的问题,我们深表歉意,再次感谢您抽出宝贵时间查看。
    • @MattJackson 这些是table aliases
    • 使用这个:``` select alias.id, j.e ->> 'sub_id' as sub_id from myTable AS alias cross join jsonb_array_elements(alias.json_data) as j(e) order by alias.id ; ```我看到这个错误:错误:函数jsonb_array_elements(文本)不存在第4行:交叉加入jsonb_array_elements(alias.json_data)作为j(e)有什么想法吗?
    • @MattJackson:那么您的列不是jsonb(或json)列,但它被定义为text - 您需要转换它。查看我的编辑
    • 谢谢@a_horse_with_no_name !真的很感激!
    猜你喜欢
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多