在 PostgreSql 中存储 JSON 个数组数组
Storing JSON Array of Arrays in PostgreSql
我在 Postgres JsonB 列中存储了以下格式的 JSON:
[
[
{"cid":"CID1","Display":"User One","FName":"User","LName":"One"},
{"cid":"CID1","Display":"User Two","FName":"User","LName":"Two"},
{"cid":"CID1","Display":"User Three","FName":"User","LName":"Three"},
{"cid":"CID2","Display":"User One","FName":"User","LName":"One"},
{"cid":"CID2","Display":"User Two","FName":"User","LName":"Two"},
{"cid":"CID2","Display":"User Three","FName":"User","LName":"Three"}
],
[
{"cid":"CID1","Display":"User One","FName":"User","LName":"One"},
{"cid":"CID1","Display":"User Two","FName":"User","LName":"Two"},
{"cid":"CID1","Display":"User Three","FName":"User","LName":"Three"},
{"cid":"CID2","Display":"User One","FName":"User","LName":"One"},
{"cid":"CID2","Display":"User Two","FName":"User","LName":"Two"},
{"cid":"CID2","Display":"User Three","FName":"User","LName":"Three"}
]
]
我想按索引获取第一个数组,然后查询 cid、Display、FName、LName 等键。然后在另一个查询中,我想按索引获取第二个数组并查询相同的键。查询应该 return 满足查询的行。我可以保存此类 JSON 的最佳格式是什么?我如何查询上面解释的键?
第一条语句returns两行,每个数组一行。
select jsonb_array_elements(msg->'root') as el
from js
然后 returns 每个单独的值作为文本。
with aa as
(
select jsonb_array_elements(msg->'root') as el
from js
)
select jsonb_array_elements(el)->>'cid' as cid,
jsonb_array_elements(el)->>'Display' as Display,
jsonb_array_elements(el)->>'FName' as FName,
jsonb_array_elements(el)->>'LName' as LName
from aa;
这个returns第二个数组的第3个元素
select (ARRAY(select * from jsonb_array_elements(A1.Elements)))[3] Elem
from
(select (ARRAY(select * from jsonb_array_elements(msg->'root')))[2] Elements
from js) A1;
以下值是根据我在 resxtester 项目中使用的数据得出的。可能与您的 json 文本不匹配。
{"cid": "CID2", "FName": "User", "LName": "Three", "Display": "User
Three"}
在这里查看:http://rextester.com/IAU74251
更新
按第一个数组的某些字段过滤:
select * from
(select jsonb_array_elements(msg->'root'->0) as a from js) elem
where elem.a->>'Display' like '%Two';
我在 Postgres JsonB 列中存储了以下格式的 JSON:
[
[
{"cid":"CID1","Display":"User One","FName":"User","LName":"One"},
{"cid":"CID1","Display":"User Two","FName":"User","LName":"Two"},
{"cid":"CID1","Display":"User Three","FName":"User","LName":"Three"},
{"cid":"CID2","Display":"User One","FName":"User","LName":"One"},
{"cid":"CID2","Display":"User Two","FName":"User","LName":"Two"},
{"cid":"CID2","Display":"User Three","FName":"User","LName":"Three"}
],
[
{"cid":"CID1","Display":"User One","FName":"User","LName":"One"},
{"cid":"CID1","Display":"User Two","FName":"User","LName":"Two"},
{"cid":"CID1","Display":"User Three","FName":"User","LName":"Three"},
{"cid":"CID2","Display":"User One","FName":"User","LName":"One"},
{"cid":"CID2","Display":"User Two","FName":"User","LName":"Two"},
{"cid":"CID2","Display":"User Three","FName":"User","LName":"Three"}
]
]
我想按索引获取第一个数组,然后查询 cid、Display、FName、LName 等键。然后在另一个查询中,我想按索引获取第二个数组并查询相同的键。查询应该 return 满足查询的行。我可以保存此类 JSON 的最佳格式是什么?我如何查询上面解释的键?
第一条语句returns两行,每个数组一行。
select jsonb_array_elements(msg->'root') as el
from js
然后 returns 每个单独的值作为文本。
with aa as
(
select jsonb_array_elements(msg->'root') as el
from js
)
select jsonb_array_elements(el)->>'cid' as cid,
jsonb_array_elements(el)->>'Display' as Display,
jsonb_array_elements(el)->>'FName' as FName,
jsonb_array_elements(el)->>'LName' as LName
from aa;
这个returns第二个数组的第3个元素
select (ARRAY(select * from jsonb_array_elements(A1.Elements)))[3] Elem
from
(select (ARRAY(select * from jsonb_array_elements(msg->'root')))[2] Elements
from js) A1;
以下值是根据我在 resxtester 项目中使用的数据得出的。可能与您的 json 文本不匹配。
{"cid": "CID2", "FName": "User", "LName": "Three", "Display": "User Three"}
在这里查看:http://rextester.com/IAU74251
更新
按第一个数组的某些字段过滤:
select * from
(select jsonb_array_elements(msg->'root'->0) as a from js) elem
where elem.a->>'Display' like '%Two';