Sql 如何查询postgres json列中的嵌套数组?
我在postgres json列中存储了一些类似于下面json的json。我正在尝试查询它以识别一些输入错误的数据。我基本上是在寻找房屋描述与房屋编号相同的地址。我不太明白怎么做Sql 如何查询postgres json列中的嵌套数组?,sql,arrays,json,postgresql,nested,Sql,Arrays,Json,Postgresql,Nested,我在postgres json列中存储了一些类似于下面json的json。我正在尝试查询它以识别一些输入错误的数据。我基本上是在寻找房屋描述与房屋编号相同的地址。我不太明白怎么做 { "timestamp": "2014-10-23T16:15:28+01:00", "schools": [ { "school_id": "1", "addresses": [ { "town": "Birmingham", "house
{
"timestamp": "2014-10-23T16:15:28+01:00",
"schools": [
{
"school_id": "1",
"addresses": [
{
"town": "Birmingham",
"house_description": "1",
"street_name": "Parklands",
"addr_id": "4",
"postcode": "B5 8KL",
"house_no": "1",
"address_type": "UK"
},
{
"town": "Plymouth",
"house_description": "Flat a",
"street_name": "Fore Street",
"addr_id": "2",
"postcode": "PL9 8AY",
"house_no": "15",
"address_type": "UK"
}
]
},
{
"school_id": "2",
"addresses": [
{
"town": "Coventry",
"street_name": "Shipley Way",
"addr_id": "19",
"postcode": "CV8 3DL",
"house_no": "662",
"address_type": "UK"
}
]
}
]
}
我编写了以下sql,它将查找数据匹配的位置:
select *
FROM title_register_data
where address_data->'schools'->0->'addresses'->0->>'house_description'=
address_data->'schools'->0->'addresses'->0->>'house_no'
这显然只适用于第一所学校的第一个地址。有没有办法查询每所学校的所有地址?在横向连接中使用
jsonb\u array\u elements()
的次数与要比较的json数组元素的深度相同:
select
schools->>'school_id' school_id,
addresses->>'addr_id' addr_id,
addresses->>'house_description' house_description,
addresses->>'house_no' house_no
from title_register_data,
jsonb_array_elements(address_data->'schools') schools,
jsonb_array_elements(schools->'addresses') addresses
where addresses->>'house_description' = addresses->>'house_no';
school_id | addr_id | house_description | house_no
-----------+---------+-------------------+----------
1 | 4 | 1 | 1
(1 row)
太好了,谢谢。这就是我想要的。我对它做了一些微调,并使用了json_数组_元素,因为它不是jsonb列,但原理是一样的。我很想给你一个双重投票,但这是不可能的:)这会删除那些学校数组为空的记录(假设没有where子句)。我们有没有优雅的方法来保存这些记录?(并将所选值保持为null?@fei0x-Use
left join。。。在true
上,我不能说我完全理解为什么,但这确实起到了作用。非常感谢。