使用PostgreSQL 12搜索jsonb列数组字段的部分值
我有一个表,其中包含一个名为data的jsonb字段。此字段可以包含任意数据。其中之一可能是电子邮件。喜欢 所以,email字段是数组。通常,如果它是一个字符串,我可以很容易地在这个数据上使用ILIKE或~*,但是,作为一个数组让我三思而后行。因为它仍然有效 我运行的查询: 从测试中选择*数据->>“电子邮件”类似“%spenc%”; -或- 从测试中选择*数据->>“电子邮件”~*“spenc”; 另见: 在数组元素上使用ilike和/或~*运算符是否正确和安全?还是有更好的方法来完成这项工作 请注意,我需要部分搜索,因为客户端只能提供部分搜索查询。所以,搜索准确的电子邮件地址对我来说不是一个选择,但它不应该局限于使用PostgreSQL 12搜索jsonb列数组字段的部分值,sql,postgresql,jsonb,Sql,Postgresql,Jsonb,我有一个表,其中包含一个名为data的jsonb字段。此字段可以包含任意数据。其中之一可能是电子邮件。喜欢 所以,email字段是数组。通常,如果它是一个字符串,我可以很容易地在这个数据上使用ILIKE或~*,但是,作为一个数组让我三思而后行。因为它仍然有效 我运行的查询: 从测试中选择*数据->>“电子邮件”类似“%spenc%”; -或- 从测试中选择*数据->>“电子邮件”~*“spenc”; 另见: 在数组元素上使用ilike和/或~*运算符是否正确和安全?还是有更好的方法来完成这项工作
我正在使用PostgreSQL 12.2您需要取消阵列的测试:
select t.*
from test_tbl t
where exists (select *
from jsonb_array_elements_text(t.data -> 'emails') as t(email)
where t.email like '%spence%');
或者,您可以使用表达式
select *
from test_tbl t
where data @? '$.emails[*] ? (@ like_regex ".*spenc.*")'
您需要取消阵列的测试:
select t.*
from test_tbl t
where exists (select *
from jsonb_array_elements_text(t.data -> 'emails') as t(email)
where t.email like '%spence%');
或者,您可以使用表达式
select *
from test_tbl t
where data @? '$.emails[*] ? (@ like_regex ".*spenc.*")'
我选择第二个例子。