Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何查询postgres json列中的嵌套数组?_Sql_Arrays_Json_Postgresql_Nested - Fatal编程技术网

Sql 如何查询postgres 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

我在postgres json列中存储了一些类似于下面json的json。我正在尝试查询它以识别一些输入错误的数据。我基本上是在寻找房屋描述与房屋编号相同的地址。我不太明白怎么做

{
  "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
上,我不能说我完全理解为什么,但这确实起到了作用。非常感谢。