jsonb 在数组中找到一个值

时间:2021-04-09 08:41:38

标签: sql arrays json postgresql jsonb

有这样一个数据结构:

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}]'

1 个答案:

答案 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' 可以作为参数传递给您的查询。但这永远不会使用索引。

相关问题