使用 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
我试图为每一行获取 "status" 和 "timestamp" 的值。
我不明白如何为每一行隔离这两个信息。
我试过:
select
statushistory::json -> 'status',
statushistory::json -> 'timestamp',
idorder
from json_data;
但它只给我一个完全空白的列。
我正在尝试获得这样的东西:
status timestamp idorder
inStock xxx id1
failed yyy id1
toReschedule zzz id2
我是不是做错了什么?
好的,我找到了!
这是代码:
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
谢谢大家
您可以使用横向连接和 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
我正在尝试从包含 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
我试图为每一行获取 "status" 和 "timestamp" 的值。 我不明白如何为每一行隔离这两个信息。
我试过:
select
statushistory::json -> 'status',
statushistory::json -> 'timestamp',
idorder
from json_data;
但它只给我一个完全空白的列。
我正在尝试获得这样的东西:
status timestamp idorder
inStock xxx id1
failed yyy id1
toReschedule zzz id2
我是不是做错了什么?
好的,我找到了! 这是代码:
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
谢谢大家
您可以使用横向连接和 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