如何查询 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 索引
目前我的 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