使用PostgreSQL 12搜索jsonb列数组字段的部分值

使用PostgreSQL 12搜索jsonb列数组字段的部分值,sql,postgresql,jsonb,Sql,Postgresql,Jsonb,我有一个表,其中包含一个名为data的jsonb字段。此字段可以包含任意数据。其中之一可能是电子邮件。喜欢 所以,email字段是数组。通常,如果它是一个字符串,我可以很容易地在这个数据上使用ILIKE或~*,但是,作为一个数组让我三思而后行。因为它仍然有效 我运行的查询: 从测试中选择*数据->>“电子邮件”类似“%spenc%”; -或- 从测试中选择*数据->>“电子邮件”~*“spenc”; 另见: 在数组元素上使用ilike和/或~*运算符是否正确和安全?还是有更好的方法来完成这项工作

我有一个表,其中包含一个名为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.*")'

我选择第二个例子。