从非结构化 JSON 数据中获取键和值
Get key and value from unstructured JSON data
我有以下 table 和一些数据:
Table:
create table tbl_jsontest
(
id int,
jdata json
);
记录:
insert into tbl_jsontest values(1,'{"Id":1,"Name":"Jack"}');
insert into tbl_jsontest values(1,'[{"Id":2,"Name":"Mak"},{"Name":"Aez","Address":"ZX"}]');
insert into tbl_jsontest values(1,'[{"Id":5,"Name":"Lee"}]');
查询:
SELECT json_data.key AS key1,
json_data.value AS value1
FROM tbl_jsontest,
json_each_text(tbl_jsontest.jdata) AS json_data;
出现错误:
ERROR: cannot deconstruct an array as an object
json_each_text 函数将 json 对象作为输入,不适用于数组。
文档https://www.postgresql.org/docs/current/functions-json.html
json_each_text ( json ) → setof record ( key text, value text )
将顶级 JSON 对象扩展为一组 key/value 对。返回值将是文本类型。
可以先用json_array_elements
展开数组,再展开对象
您还应该将 jdata 重新格式化为相同的格式
记录:
insert into tbl_jsontest values(1,'[{"Id":1,"Name":"Jack"}]');
insert into tbl_jsontest values(1,'[{"Id":2,"Name":"Mak"},{"Name":"Aez","Address":"ZX"}]');
insert into tbl_jsontest values(1,'[{"Id":5,"Name":"Lee"}]');
查询:
select t.id, key, value
from (SELECT id, json_array_elements(tbl_jsontest.jdata) d
FROM tbl_jsontest) t,
json_each_text(t.d);
结果:
+--+-------+-----+
|id|key |value|
+--+-------+-----+
|1 |Id |2 |
|1 |Name |Mak |
|1 |Name |Aez |
|1 |Address|ZX |
|1 |Id |5 |
|1 |Name |Lee |
|1 |Id |1 |
|1 |Name |Jack |
+--+-------+-----+
我有以下 table 和一些数据:
Table:
create table tbl_jsontest
(
id int,
jdata json
);
记录:
insert into tbl_jsontest values(1,'{"Id":1,"Name":"Jack"}');
insert into tbl_jsontest values(1,'[{"Id":2,"Name":"Mak"},{"Name":"Aez","Address":"ZX"}]');
insert into tbl_jsontest values(1,'[{"Id":5,"Name":"Lee"}]');
查询:
SELECT json_data.key AS key1,
json_data.value AS value1
FROM tbl_jsontest,
json_each_text(tbl_jsontest.jdata) AS json_data;
出现错误:
ERROR: cannot deconstruct an array as an object
json_each_text 函数将 json 对象作为输入,不适用于数组。
文档https://www.postgresql.org/docs/current/functions-json.html
json_each_text ( json ) → setof record ( key text, value text )
将顶级 JSON 对象扩展为一组 key/value 对。返回值将是文本类型。
可以先用json_array_elements
展开数组,再展开对象
您还应该将 jdata 重新格式化为相同的格式
记录:
insert into tbl_jsontest values(1,'[{"Id":1,"Name":"Jack"}]');
insert into tbl_jsontest values(1,'[{"Id":2,"Name":"Mak"},{"Name":"Aez","Address":"ZX"}]');
insert into tbl_jsontest values(1,'[{"Id":5,"Name":"Lee"}]');
查询:
select t.id, key, value
from (SELECT id, json_array_elements(tbl_jsontest.jdata) d
FROM tbl_jsontest) t,
json_each_text(t.d);
结果:
+--+-------+-----+
|id|key |value|
+--+-------+-----+
|1 |Id |2 |
|1 |Name |Mak |
|1 |Name |Aez |
|1 |Address|ZX |
|1 |Id |5 |
|1 |Name |Lee |
|1 |Id |1 |
|1 |Name |Jack |
+--+-------+-----+