【问题标题】:how can I "unwrap" JSON arrays stored in a PostgreSQL database?如何“解包”存储在 PostgreSQL 数据库中的 JSON 数组?
【发布时间】:2021-02-01 14:30:28
【问题描述】:

我有一个 postgresql 数据库,其中包含一个 json 列,以及一些普通列。

json 列存储一个对象数组,如下所示:

[
   {"status": "REGD", "register": "EYR", "start_date": "2008-09-01"}, 
   {"status": "REGD", "register": "CCR", "start_date": "2008-09-01"}, 
   {"status": "REGD", "register": "VCR", "start_date": "2008-09-01"}
]

我想在这个表上做一个SELECT 查询,分解数组,这样每个数组就是它自己的行,比如:

| status  | register  | start_date   |
--------------------------------------
| "REGD"  | "EYR"     | "2008-09-01" |
| "REGD"  | "CCR"     | "2008-09-01" |
| "REGD"  | "VCR"     | "2008-09-01" |

我该怎么做?我已经尝试过运算符->>->,但我没有看到像这样解开数组的简单方法。

看起来一些 postgres 的 json functions 会有所帮助,但我正在努力将它们应用于这种情况。

mongodb 有一个unwind 操作。我想我正在寻找类似的东西(已编辑)


更新:我有一些使用 json_array_elements 的东西,但我仍在努力将每个键解压缩到自己的列中。

这不太行:

SELECT
    jsonb_array_elements(registers) AS register
    register->>'register' AS register_name

FROM items

【问题讨论】:

    标签: sql json postgresql


    【解决方案1】:

    试试这个,json_array_elements()。我还包含了一个 CAST(),但这取决于你:

    SELECT  j->>'status'
        ,   j->>'register'
        ,   CAST(j->>'start_date' AS date)
    FROM    json_array_elements('
    [
       {"status": "REGD", "register": "EYR", "start_date": "2008-09-01"}, 
       {"status": "REGD", "register": "CCR", "start_date": "2008-09-01"}, 
       {"status": "REGD", "register": "VCR", "start_date": "2008-09-01"}
    ]'::json) s(j)
    

    【讨论】:

      【解决方案2】:

      这里mytable CTE 使用another_column 模仿您现有的表格以作说明。

      with mytable(another_column, j) as 
      (
       select 'other values', 
       '[
         {"status": "REGD", "register": "EYR", "start_date": "2008-09-01"}, 
         {"status": "REGD", "register": "CCR", "start_date": "2008-09-01"}, 
         {"status": "REGD", "register": "VCR", "start_date": "2008-09-01"}
       ]'::json
      )
      select another_column, 
             jae ->> 'status' status,
             jae ->> 'register' register,
             jae ->> 'start_date' start_date 
        from mytable 
       cross join lateral json_array_elements(j) jae;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-22
        • 2020-06-07
        • 2015-10-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多