Postgres:在嵌套在JSON中的ID上加入表

时间:2014-09-19 20:02:24

标签: json postgresql

我在postgres db中创建了2个表,每个表包含两列,一个uuid列和一个包含JSON的列。

表A(各省):

第1栏(省份ID):

“112233”

第2栏(JSON):

{
    "id": "123",
    "name":"Ontario",
    "cities": [
     "456",
     "789",
     "112",
     "141"
    ],
    "status": 0
}

表B(城市):

第1栏(CityId):

“465”

第2栏(JSON):

{
    "id": "456",
    "name":"Toronto",
    "NHL Team": 1
    "Population": 4000000
}

在这个例子中,一个省与城市有一对多的关系。到目前为止我没有做到的是将表A(省)中的一个省加入表B(城市)的所有城市。我没有这样做,因为CityId存储为表A(省份)中的嵌套字段。

e.g。

FROM Provinces JOIN Cities on (Provinces.JSON->'Cities' = Cities.CityId)

我已经尝试了内置的JSON函数#>, - >,json_array_elements - 我似乎找不到能够返回正确输出的解决方案。

感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

select *
from
    (
        select
            id, name,
            json_array_elements(JSON -> 'cities')::text::int as CityId,
            status
        from provinces
    ) provinces p
    inner join
    Cities c using (CityId)

在发布的JSON数据中,cities属性的小写首字母。如果它有第一个大写字母,那么更改上面的代码。

如果CityId表格中的Cities属于text类型,则无需将JSON -> 'cities'投射到integer

BTW看起来像糟糕的数据库设计。 JSON不能代替好的设计。