如何查询 jsonb 数组以查找它是否包含查询列表中的值?

How can I query a jsonb array to find if it contains a value from a query list?

目前我的 table 看起来像这样

 id |                 companies                 
----+-------------------------------------------------------------------
  1 | {"companies": [{"name": "Google", "industry": "TECH"}, 
    |                {"name": "FOX News", "industry": "MEDIA"}]}
----+--------------------------------------------------------------------
  2 | {"companies": [{"name": "Honda", "industry": "AUTO"}]}
----+--------------------------------------------------------------------
  3 | {"companies": [{"name": "Nike", "industry": "SPORTS"}]}

我想获取所有行,因为 companies JSONB 数组包含列表中的行业公司 ["TECH", "SPORTS"]

在此示例中,查询将 return 第 1 行和第 3 行。

由于涉及嵌套,我不确定如何执行此操作。

您可以使用 jsonb_array_elements()exists:

select t.*
from mytable t
where exists (
    select 1
    from jsonb_array_elements(t.companies -> 'companies') x(obj)
    where x.obj ->> 'industry' in ('TECH', 'SPORTS')
)

另一种写法是使用包含运算符 @>

select *
from the_table t
where t.companies -> 'companies' @> '[{"industry": "TECH"}]'
   or t.companies -> 'companies' @> '[{"industry": "SPORTS"}]'

这可以利用 companies

上的 GIN 索引