我想读取JSON的所有元素以获得文本形式的值,但我获得的值带有双引号。也请帮助我如何更好地读取嵌套的JSON的所有元素,这些元素有多个数组元素。
create table jtest (id integer,doc jsonb);
insert into jtest values
(1, '{
"empdet":{
"isMgr":false,
"deptno":"102",
"selectedDept":{
"deptno":"102",
"empName":"MILLER SALESMAN" },
"selectedMgrs":[
{ "id":"1",
"list":[
{ "mgrName":"KING",
"mgrRole":"KING PRESIDENT" },
{ "mgrName":"SCOTT",
"mgrRole":"SCOTT MGR" }
],
"minApp":"1"
}
]
},
"jobIds":[ 770 ],
"appMgrs":[
{ "mgrId":"KING",
"mgrType":"U"
}
],
"deptLoc":"NEW YORK"
}');
insert into jtest values
(2, '{
"empdet":{
"isMgr":false,
"deptno":"101",
"selectedDept":{
"deptno":"101",
"empName":"SMITH SALESMAN" },
"selectedMgrs":[
{ "id":"2",
"list":[
{ "mgrName":"KING",
"mgrRole":"KING PRESIDENT" },
{ "mgrName":"BLAKE",
"mgrRole":"BLAKE MGR" }
],
"minApp":"1"
}
]
},
"jobIds":[ 775 ],
"appMgrs":[
{ "mgrId":"KING",
"mgrType":"U"
}
],
"deptLoc":"NEW YORK"
}');
select id,
doc-> 'empdet'->'selectedDept'->>'empName' empName,
doc-> 'empdet'->>'deptno' deptno,
jsonb_path_query_first(doc, '$.empdet.selectedMgrs.id' ) id,
jsonb_path_query(doc, '$.empdet.selectedMgrs.list[*]' )->>'mgrRole' mgrRole,
jsonb_path_query(doc, '$.empdet.selectedMgrs.list[*]')->>'mgrName' mgrName,
jsonb_path_query_first(doc, '$.empdet.selectedMgrs.minApp' ) minApp,
jsonb_path_query_first(doc, '$.appMgrs.mgrId') mgrId,
jsonb_path_query_first(doc, '$.appMgrs.mgrType' ) mgrType,
doc->>'deptLoc' deptLoc,
jsonb_path_query_first(doc, '$.jobIds[*]' ) jobIds
from jtest;
2条答案
按热度按时间rkttyhzu1#
您看到的双引号是因为您使用
jsonb_path_query()
检索的值是jsonb
类型。您可以使用pg_typeof()
进行检查:demo要获取没有这些的值,你可以使用函数获取外部对象,然后使用
->>
运算符从它获取文本值,然后甚至可以使用::int
转换它:demoxjreopfe2#
我想读取JSON的所有元素以获得文本形式的值,但我获得的值带有双引号。
由于jsonb_path_query_first返回jsonb,我们需要首先将结果转换为文本,然后使用
REPLACE
删除引号:也请帮助我如何更好地读取嵌套的JSON的所有元素,这些元素有多个数组元素。
要访问一个数组,例如
selectedMgrs
,你可以使用jsonb_array_elements
:要访问数组的数组,请尝试以下操作:
要获取文本形式的JSON元素,可以使用运算符
->>
Demo here