sql - PostgreSQL 对数组不区分大小写的 SELECT

标签 sql postgresql pattern-matching case-insensitive

我在此处、谷歌或文档中找不到答案...
我需要针对数组类型执行不区分大小写的选择。

如果:

value = {"Foo","bar","bAz"}

我需要

SELECT value FROM table WHERE 'foo' = ANY(value)

匹配。

我尝试了很多 lower() 的组合,但都没有成功。

ILIKE 而不是 = 似乎可行,但我一直对 LIKE 感到紧张 - 这是最好的方法吗?

最佳答案

未提及的替代方法是安装 the citext extension PostgreSQL 8.4+ 附带的,并使用 citext 数组:

regress=# CREATE EXTENSION citext;
regress=# SELECT 'foo' = ANY( '{"Foo","bar","bAz"}'::citext[] );
 ?column? 
----------
 t
(1 row)

如果你想对此严格正确并避免扩展你必须做一些pretty ugly subqueries因为 Pg 没有很多丰富的数组操作,尤其是没有函数式映射操作。像这样的东西:

SELECT array_agg(lower(($1)[n])) FROM generate_subscripts($1,1) n;

... 其中 $1 是数组参数。在你的情况下,我认为你可以作弊一点,因为你不关心保留数组的顺序,所以你可以这样做:

SELECT 'foo' IN (SELECT lower(x) FROM unnest('{"Foo","bar","bAz"}'::text[]) x);

关于sql - PostgreSQL 对数组不区分大小写的 SELECT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16311289/

相关文章:

java - Android海量数据库创建

SQL 查询以过滤特定记录计数的记录

除列表之外的序列上的 Scala 模式匹配

loops - 当我只关心一个变体而不关心变体中的值时,循环匹配的惯用方法是什么?

java - 捕获字符串上匹配字符(单个或重复)之间的所有字符

mysql - 如何检查 SQL 中 VARCHAR(50) 列的值

sql - 在 Oracle 中部署相同 View 的多个版本

postgresql - 使用一些数据初始化 PostgreSQL docker 容器的最佳实践

postgresql - PL/pgSQL : Can we store a query result into a variable

postgresql - 在 PostgreSQL 中使用子查询