查询 JSONB 中的对象数组
Querying an array of objects in JSONB
我有一个 table,其列的数据类型为 JSONB。该列中的每一行都有一个 JSON,看起来像这样:
[
{
"A":{
"AA": "something",
"AB": false
}
},
{
"B": {
"BA":[
{
"BAAA": [1,2,3,4]
},
{
"BABA": {
....
}
}
]
}
}
]
注:JSON是一团乱七八糟的列表和对象,一共300行。不是我的数据,但我坚持使用它。 :(
我正在使用 postgresql 版本 12
我将如何编写以下查询:
- Return AB 值设置为 false 的所有行。
- Return BAAA 的值是每一行。
您可以使用 JSON 路径查询找到 AB = false 行:
select *
from test
where data @@ '$[*].A.AB == false'
如果您不知道密钥 AB
的确切位置,您可以使用:
select *
from test
where data @@ '$[*].**.AB == false'
要将数组中的所有元素显示为行,您可以使用:
select id, e.*
from test
cross join jsonb_array_elements(jsonb_path_query_first(data, '$[*].B.BA.BAAA')) with ordinality as e(item, idx)
我包含一个“id”列作为主键列的占位符,以便可以在输出中确定数组元素的来源。
我有一个 table,其列的数据类型为 JSONB。该列中的每一行都有一个 JSON,看起来像这样:
[
{
"A":{
"AA": "something",
"AB": false
}
},
{
"B": {
"BA":[
{
"BAAA": [1,2,3,4]
},
{
"BABA": {
....
}
}
]
}
}
]
注:JSON是一团乱七八糟的列表和对象,一共300行。不是我的数据,但我坚持使用它。 :(
我正在使用 postgresql 版本 12
我将如何编写以下查询:
- Return AB 值设置为 false 的所有行。
- Return BAAA 的值是每一行。
您可以使用 JSON 路径查询找到 AB = false 行:
select *
from test
where data @@ '$[*].A.AB == false'
如果您不知道密钥 AB
的确切位置,您可以使用:
select *
from test
where data @@ '$[*].**.AB == false'
要将数组中的所有元素显示为行,您可以使用:
select id, e.*
from test
cross join jsonb_array_elements(jsonb_path_query_first(data, '$[*].B.BA.BAAA')) with ordinality as e(item, idx)
我包含一个“id”列作为主键列的占位符,以便可以在输出中确定数组元素的来源。