繁体   English   中英

使用Json数据读取Postgresql列

[英]Read postgresql column with Json data

我试图从包含json数据的列中提取信息。

这是一个例子:

statushistory   idorder
[{"timestamp":"2016-10-10T14:42:23.386Z","status":"unassigned"},{"timestamp":"2016-10-10T07:21:08.634Z","status":"baseline"},{"timestamp":"2016-10-11T08:36:55.882Z","status":"inTransit"},{"timestamp":"2016-10-10T11:03:36.491Z","status":"toReschedule"},{"timestamp":"2016-10-11T07:30:56.897Z","status":"baseline"},{"timestamp":"2016-10-10T08:07:36.500Z","status":"inTransit"},{"timestamp":"2016-10-10T11:11:20.489Z","status":"committed"},{"timestamp":"2016-10-10T05:59:45.761Z","status":"unassigned"},{"timestamp":"2016-10-11T12:15:25.975Z","status":"fulfilled"},{"timestamp":"2016-10-11T12:16:25.766Z","status":"fulfilled"},{"timestamp":"2016-10-10T11:02:36.442Z","status":"toReschedule"}]   281474981556785
[{"timestamp":"2016-10-11T12:40:29.373Z","status":"toReschedule"},{"timestamp":"2016-10-11T12:41:29.710Z","status":"toReschedule"},{"timestamp":"2016-10-11T07:30:57.231Z","status":"baseline"},{"timestamp":"2016-10-11T14:26:45.995Z","status":"rescheduled"},{"timestamp":"2016-10-11T08:36:59.080Z","status":"inTransit"},{"timestamp":"2016-10-10T14:42:23.387Z","status":"unassigned"}]   281474983220313
    [{"timestamp":"2016-10-11T14:03:28.137Z","status":"baseline"},{"timestamp":"2016-10-11T19:37:44.172Z","status":"rescheduled"},{"timestamp":"2016-10-11T18:44:33.473Z","status":"toReschedule"},{"timestamp":"2016-10-10T14:42:23.385Z","status":"unassigned"},{"timestamp":"2016-10-11T18:45:35.284Z","status":"toReschedule"},{"timestamp":"2016-10-11T14:39:34.867Z","status":"inTransit"}]   281474983332443
    [{"timestamp":"2016-10-11T08:21:59.122Z","status":"rescheduled"}]   281474983118369
    [{"timestamp":"2016-10-11T10:40:25.666Z","status":"fulfilled"},{"timestamp":"2016-10-10T14:42:23.386Z","status":"unassigned"},{"timestamp":"2016-10-11T10:39:25.888Z","status":"fulfilled"},{"timestamp":"2016-10-11T07:30:56.971Z","status":"baseline"},{"timestamp":"2016-10-11T08:36:56.033Z","status":"inTransit"}] 281474982795357
    [{"timestamp":"2016-10-10T14:42:23.386Z","status":"unassigned"},{"timestamp":"2016-10-11T14:03:20.803Z","status":"baseline"},{"timestamp":"2016-10-11T16:19:27.735Z","status":"fulfilled"},{"timestamp":"2016-10-11T14:39:30.396Z","status":"inTransit"},{"timestamp":"2016-10-11T16:18:26.816Z","status":"fulfilled"}] 281474981917259
    [{"timestamp":"2016-10-11T09:25:26.100Z","status":"fulfilled"},{"timestamp":"2016-10-10T14:42:23.386Z","status":"unassigned"},{"timestamp":"2016-10-11T08:36:56.132Z","status":"inTransit"},{"timestamp":"2016-10-11T07:30:56.979Z","status":"baseline"},{"timestamp":"2016-10-11T09:26:26.241Z","status":"fulfilled"}] 281474981917255

我正在尝试为每一行获取“状态”和“时间戳”的值。 我不明白如何隔离每一行的那两个信息。

我尝试过:

select 
 statushistory::json -> 'status',
 statushistory::json -> 'timestamp',
 idorder
from json_data;

但这只给了我一个完全空白的栏。

我正在尝试获得这样的东西:

status       timestamp idorder 
inStock      xxx       id1
failed       yyy       id1
toReschedule zzz       id2

难道我做错了什么?

您可以使用横向连接和jsonb_array_elements()代替调用jsonb_array_elements_text() 2次

select e.v->>'status' , e.v->>'timestamp', json_data.idorder
from json_data
join lateral jsonb_array_elements(statushistory) e(v)
on true

好的,我找到了! 这是代码:

select 
    jsonb_array_elements_text(statushistory::jsonb)::jsonb -> 'status',
    jsonb_array_elements_text(statushistory::jsonb)::jsonb -> 'timestamp',
    idorder
from json_data;

这是输出:

"unassigned"    "2016-10-10T14:42:23.386Z"  281474981556785
"baseline"  "2016-10-10T07:21:08.634Z"  281474981556785
"inTransit" "2016-10-11T08:36:55.882Z"  281474981556785
"toReschedule"  "2016-10-10T11:03:36.491Z"  281474981556785
"baseline"  "2016-10-11T07:30:56.897Z"  281474981556785
"inTransit" "2016-10-10T08:07:36.500Z"  281474981556785
"committed" "2016-10-10T11:11:20.489Z"  281474981556785
"unassigned"    "2016-10-10T05:59:45.761Z"  281474981556785
"fulfilled" "2016-10-11T12:15:25.975Z"  281474981556785
"fulfilled" "2016-10-11T12:16:25.766Z"  281474981556785

谢谢你们。

暂无
暂无

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

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