在 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';