我在此处、谷歌或文档中找不到答案...
我需要针对数组类型执行不区分大小写的选择。
如果:
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/