PostgreSQL:使用 LIKE、ANY 和通配符的 Where 子句

Posted

技术标签:

【中文标题】PostgreSQL:使用 LIKE、ANY 和通配符的 Where 子句【英文标题】:PostgreSQL: Where clause using LIKE, ANY, and wildcards 【发布时间】:2016-10-28 13:15:04 【问题描述】:

我有一个表,其中包含一个字符串数组(类型为character varying(255)[])。

我想将带有通配符的给定字符串(例如'query%')与该字段的任何元素进行比较。

此请求有效并返回预期结果:

SELECT * FROM my_table WHERE 'query' ILIKE ANY(my_field)

但是使用通配符,我没有得到任何结果:

SELECT * FROM my_table WHERE 'query%' ILIKE ANY(my_field)

我认为原因是通配符仅支持在ILIKE 运算符的右侧,但ANY(my_field) 也必须在运算符之后。

有没有办法实现我想要的?

使用 PostgreSQL 9.5。

【问题讨论】:

PostgreSQL - text Array contains value similar to的可能重复 你说得对,这是复制品,我没见过。但我很高兴@klin 写了一个详细的答案,这不在另一篇文章中。 【参考方案1】:

您必须取消嵌套数组字段:

with my_table(my_field) as (
values
    (array['query medium', 'large query']),
    (array['large query', 'small query'])
)
select t.* 
from my_table t,
lateral unnest(my_field) elem
where elem ilike 'query%';

            my_field            
--------------------------------
 "query medium","large query"
(1 row)

【讨论】:

谢谢,这是完美的解决方案。我只需要添加一个 DISTINCT(选择不同的 t.*),因为我的表中有一些行,其中 'query%' 在 my_field 中出现了多次。【参考方案2】:

使用 unnest() 将数组转换为集合并使用 EXIST 子句

SELECT * FROM my_table t WHERE  EXISTS (SELECT unnest(t.my_field) AS f WHERE f ILIKE ‘query%’)

【讨论】:

谢谢,这也是一个很好的解决方案,因为一切都保留在 where 子句中,它可能对更复杂的请求有用。但是您的请求引发了 postgresql 错误,我必须对其进行修改才能使其正常工作:SELECT * FROM my_table t WHERE EXISTS (SELECT f FROM unnest(t.my_field) AS f WHERE f ILIKE 'query%')

以上是关于PostgreSQL:使用 LIKE、ANY 和通配符的 Where 子句的主要内容,如果未能解决你的问题,请参考以下文章

Sequelize:在 PostgreSQL 的 JSON 数据类型上使用 $like

PostgreSQL LIKE 子句

PostgreSQL LIKE 子句

对 PostgreSQL 中 jsonb 字段内的对象数组使用 LIKE 运算符

c_cpp boost :: any-like class

postgresql----LIKE和SIMILAR TO