繁体   English   中英

如何“打开”存储在 PostgreSQL 数据库中的 JSON arrays ?

[英]how can I “unwrap” JSON arrays stored in a PostgreSQL database?

我有一个 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查询,分解 arrays 以便每个都是自己的行,比如:

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

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

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

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


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

这不太管用:

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

FROM items

试试这个,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)

这里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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM