Postgresql ILIKE/LIKE ANY在使用模式时不返回任何结果

Postgresql ILIKE/LIKE ANY在使用模式时不返回任何结果,sql,postgresql,Sql,Postgresql,我在PostgreSQL db版本12.1中有一个表foods,它有一个名为common_names的列,这是一个文本数组Text[]。在数据中,术语“族样式”在数据库中的“常用名称”条目中出现35次 以下3个查询都返回值“35”: 从食物中选择count1,其中“家庭风格”=任何普通名称 从食物中选择count1,其中“家庭风格”与任何普通名称一样 从“家庭风格”我喜欢的食物中选择count1 以下所有查询都返回零0: 从食物中选择count1,其中“%family%”与任何常用名称一样 从食

我在PostgreSQL db版本12.1中有一个表foods,它有一个名为common_names的列,这是一个文本数组Text[]。在数据中,术语“族样式”在数据库中的“常用名称”条目中出现35次

以下3个查询都返回值“35”:

从食物中选择count1,其中“家庭风格”=任何普通名称

从食物中选择count1,其中“家庭风格”与任何普通名称一样

从“家庭风格”我喜欢的食物中选择count1

以下所有查询都返回零0:

从食物中选择count1,其中“%family%”与任何常用名称一样

从食物中选择count1,其中“%family%”我喜欢任何常用名称

从食物中选择count1,其中“family%”与任何常用名称一样

从“FAMILY%”我喜欢任何常用名称的食品中选择count1


我做错了什么?

图案在右边,就像没有图案一样。左手边的东西只是一个字符串,不是一个图案

以下结果为假:

SELECT '%family%' LIKE 'family style'

将RHS包装在ANYARRAY中[…]不会改变其含义。

好的,在我的一位同事的帮助下,我们能够解决这个问题

因此,对于初学者来说,它看起来不像可以将like或ILIKE用于数组列——可以,它只是不能正常工作。似乎只能使用精确匹配

但是,您可以出于搜索目的取消对数组的测试

以下是最终有效的查询:

SELECT COUNT(1) FROM (
    SELECT global_id, common_names FROM foods,
        LATERAL unnest(common_names) AS common_names(common_name)
    WHERE common_name LIKE '%family%'
    GROUP BY global_id, common_names) AS X;

您可以在WHERE子句中完成这一切:


我不这么认为;ANY用于匹配数组中的任何项。另外,前三个命令使用这种格式,它们可以工作。文档示例如下:从sal_emp中选择*其中10000=按季度支付的任何工资;我想你没有领会他的意思。通配符跟在后面,比如。。。。如果存在,请从unnestcommonic_名称中选择1作为x,其中x与“%family%”无关,但count1实际上略慢于count*
where exists (select 1
              from unnest(common_names) u(common_name)
              where u.common_name like '%family%'
             )