让我们假设表下面提到了字段,在这些字段中,"details“列保留JSON格式的值。
| id | firstName | lastName | title | details(json) |
保存详细信息列的json示例可以如下所示
{
"email": "example@gmail.com",
"phoneNumber1": "+94111111111",
"phoneNumber2": "+44111111111",
"locations": [
{
"code": "LK",
"name": "Sri Lanka",
"lat": 128.12,
"lon": 138.23
},
{
"code": "UK",
"name": "England",
"lat": 148.12,
"lon": 158.23
},
{
"code": "IND",
"name": "India",
"lat": 163.12,
"lon": 172.23
}
]
}
我需要过滤从地点代码和同时需要通过详细的电子邮件订购。
举个例子
--------------------------------
details->>'code' IN ('LK','UK')
ORDER BY details->>'email'
--------------------------------
PostgreSQL 13.4
发布于 2022-07-15 11:12:11
我使用下面提到的查询解决了这个问题。
这个问题,
SELECT firstname, lastname, details
FROM
(
SELECT DISTINCT((person.details)::jsonb) as details, person.firstname,
person.lastname
FROM person
CROSS JOIN json_array_elements(person.details->'locations') AS locations
WHERE locations->>'code' IN ('LK','GB')
) as result
ORDER BY details->'email' DESC
因为,ORDER子句只能在应用了DISTINCT之后才能应用。
发布于 2022-07-13 09:31:27
您需要参考PostgreSQL文档中的JSON数据类型。看这里:
https://www.postgresql.org/docs/current/datatype-json.html
在这些文档中,您将看到jsonb数据类型可以用于索引(因此可以支持您的过滤需求)。
您还将看到对函数的引用,这些函数可以从JSON列提取属性,用于排序和筛选。
最后,您可能希望在数据库中创建用户定义的函数,以提取和返回JSON数据的相关部分,以便在SELECT语句中易于使用,如下所示.
SELECT
GetEmailAddressFromJSON()
FROM table
WHERE
IsLocationCodeFromJSON(:locationCode)
ORDER BY
GetEmailAddressFromJSON()
https://stackoverflow.com/questions/72886911
复制相似问题