有这样一个数据结构:
Column "recipient" type jsonb
{
"phoneNumbers": [
{
"isDefault": true,
"type": "MOBILE",
"number": "3454654645"
},
{
"isDefault": true,
"type": "MOBILE",
"number": "12423543645"
}
]
}
我需要按号码写一个搜索请求。在 postgres 文档中,我没有在数组中找到按值搜索,只是通过索引获取。不适合我
我做了一个这样的查询,它被执行了,但是还有其他方法可以搜索数组吗?
SELECT *
FROM my_table
WHERE recipient -> 'phoneNumbers' @> '[{"number":3454654645}]'
答案 0 :(得分:3)
这几乎是最好的方法,是的。
如果您在 recipient
上有 (GIST) 索引,则您的条件将不会使用该索引。但是以下可以使用这样的索引:
SELECT *
FROM my_table
WHERE recipient @> '["phoneNumbers": {"number":3454654645}]}'
如果您使用的是 Postgres 12 或更高版本,您还可以使用 JSON 路径表达式:
SELECT *
FROM my_table
WHERE recipient @@ '$.phoneNumbers[*].number == "12423543645"'
如果您无法将 JSON 对象传递给您的查询,您可以使用 EXISTS 子选择:
SELECT mt.*
FROM my_table mt
WHERE EXISTS (SELECT *
FROM jsonb_array_elements_text(mt.recipient -> 'phoneNumbers') as x(element)
WHERE x.element ->> 'number' = '3454654645')
'3454654645'
可以作为参数传递给您的查询。但这永远不会使用索引。