Uma alternativa não mencionada é instalar o o
citext
extensão
que vem com o PostgreSQL 8.4+ e usa um array de citext
:regress=# CREATE EXTENSION citext;
regress=# SELECT 'foo' = ANY( '{"Foo","bar","bAz"}'::citext[] );
?column?
----------
t
(1 row)
Se você quiser ser estritamente correto sobre isso e evitar extensões, precisará fazer algumas subconsultas muito feias porque o Pg não tem muitas operações de matriz ricas, em particular nenhuma operação de mapeamento funcional. Algo como:
SELECT array_agg(lower(($1)[n])) FROM generate_subscripts($1,1) n;
... onde $1 é o parâmetro da matriz. No seu caso, acho que você pode trapacear um pouco porque não se importa em preservar a ordem do array, então você pode fazer algo como:
SELECT 'foo' IN (SELECT lower(x) FROM unnest('{"Foo","bar","bAz"}'::text[]) x);