PG中支持字段存储原生的json对象,本文介绍如何解析json类型的字段。
-> 和 ->> 操作符
-> 操作符通过键名访问 JSON 对象,返回JSON类型的结果
->> 操作符通过键名访问 JSON 对象,返回文本类型的结果
# 假设user表的profile字段为json类型,存储的数据如下:
{
"forms": [
{
"name": "客户信息",
"app_id": "65fe3c153fd1dc7a68300000",
"entry_id": "65d80f7d698c9e4aa5000000"
},
{
"name": "客户评价",
"app_id": "65fe3c153fd1dc7a68300000",
"entry_id": "65d80f91b1f98f7a46400000"
},
{
"name": "项目立项",
"app_id": "65fe3c153fd1dc7a68300000",
"entry_id": "65d80fd93773fc7526300000"
}
]
}
# 遍历数组返回标准二维表(图1)
SELECT
elem ->> 'name' AS NAME,
elem ->> 'app_id' AS app_id,
elem ->> 'entry_id' AS entry_id
FROM users,
json_array_elements(profile -> 'forms') AS elem;
# 访问数组中的特定元素(比如第3个元素)(图2)
SELECT
profile -> 2 AS profile
FROM users;
图1
图2
#> 和 #>> 操作符
对于数组或嵌套的 JSON 对象,可以使用 #> 和 #>> 操作符。
#> 用于访问嵌套的键,返回JSON类型的结果
#>> 同样用于访问嵌套键,返回文本类型的结果
# 假设user表的profile字段为json类型,存储的数据如下:
{
"name": "Alice",
"email": "alice@example.com",
"address": {
"city": "Wonderland",
"zipcode": "12345"
}
}
# 提取 email 和 address 中的 city(图3)
SELECT
profile ->> 'email' AS email,
profile #>> '{address, city}' AS city1
profile -> 'address' ->> 'city' AS city2
FROM users;
图3