如何解决Postgres-如何在JSONB字段上执行LIKE查询?
我有一个名为passengers
的jsonb字段,具有以下结构:
请注意,人是一个数组
{
"adults": {
"count": 2,"persons": [
{
"age": 45,"name": "Prof. Kyleigh Walsh II","birth_date": "01-01-1975"
},{
"age": 42,"name": "Milford Wiza","birth_date": "02-02-1978"
}
]
}
}
如何对该JSONB的名称字段执行查询?例如,要选择与名称字段Prof
匹配的所有行?
这是我的基本尝试:
SELECT passengers from opportunities
WHERE 'passengers->adults' != NULL
AND 'passengers->adults->persons->name' LIKE '%Prof';
这将返回0行,但是如您所见,我有一行名为Prof. Kyleigh Walsh II
解决方法
此:'passengers->adults->persons->name' LIKE '%Prof';
检查字符串'passengers->adults->persons->name'
是否以Prof
结尾。
JSON运算符的每个键都必须是一个单独的元素,并且列名一定不能用单引号引起来。因此,'passengers->adults->persons->name'
必须为passengers -> 'adults' -> 'persons' -> 'name'
->
运算符返回一个jsonb
值,您需要一个text
值,因此最后一个运算符应为->>
!= null
也不起作用,您需要使用is not null
。
SELECT passengers
from opportunities
WHERE passengers -> 'adults' is not NULL
AND passengers -> 'adults' -> 'persons' ->> 'name' LIKE 'Prof%';
is not null
条件并不是真正必要的,因为第二个条件隐含了该条件。第二个条件可以简化为:
SELECT passengers
from opportunities
WHERE passengers #>> '{adults,persons,name}' LIKE 'Prof%';
但是由于persons
是一个数组,因此上述方法不起作用,您需要使用其他方法。
使用Postgres 9.6时,您将需要一个子查询来取消嵌套数组元素(从而遍历每个元素)。
SELECT passengers
from opportunities
WHERE exists (select *
from jsonb_array_elements(passengers -> 'adults' -> 'persons') as p(person)
where p.person ->> 'name' LIKE 'Prof%');
要以LIKE开头匹配字符串,通配符必须位于结尾。 '%Prof'
将匹配'Some Prof'
,但不匹配'Prof. Kyleigh Walsh II'
对于Postgres 12,您可以使用SQL/JSON Path表达式:
SELECT passengers
from opportunities
WHERE passengers @? '$.adults.persons[*] ? (@.name like_regex "Prof.*")'
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。