A abordagem mais comum é minúscula ou maiúscula a sequência de pesquisa e os dados. Mas há dois problemas com isso.
- Funciona em inglês, mas não em todos os idiomas. (Talvez nem na maioria dos idiomas.) Nem toda letra minúscula tem uma letra maiúscula correspondente; nem toda letra maiúscula possui uma letra minúscula correspondente.
- Usar funções como inferior () e superior () fornecerá uma varredura seqüencial. Não pode usar índices. No meu sistema de teste, usar lower () leva cerca de 2000 vezes mais que uma consulta que pode usar um índice. (Os dados de teste têm pouco mais de 100 mil linhas.)
Existem pelo menos três soluções usadas com menos frequência que podem ser mais eficazes.
- Use o módulo citext , que imita principalmente o comportamento de um tipo de dados que não diferencia maiúsculas de minúsculas. Depois de carregar esse módulo, você pode criar um índice que não diferencia maiúsculas de minúsculas
CREATE INDEX ON groups (name::citext);
. (Mas veja abaixo.)
- Use um agrupamento que não diferencia maiúsculas de minúsculas. Isso é definido quando você inicializa um banco de dados. Usar um agrupamento sem distinção entre maiúsculas e minúsculas significa que você pode aceitar praticamente qualquer formato do código do cliente e ainda retornará resultados úteis. (Isso também significa que você não pode fazer consultas com distinção entre maiúsculas e minúsculas. Duh.)
- Crie um índice funcional. Crie um índice em minúsculas usando
CREATE
INDEX ON groups (LOWER(name));
. Feito isso, você pode tirar proveito do índice com consultas como SELECT id FROM groups WHERE LOWER(name) = LOWER('ADMINISTRATOR');
, ou SELECT id FROM groups WHERE LOWER(name) = 'administrator';
Você deve se lembrar de usar LOWER ().
O módulo citext não fornece um tipo de dados que não diferencia maiúsculas de minúsculas. Em vez disso, ele se comporta como se cada sequência tivesse letras minúsculas. Ou seja, ele se comporta como se você tivesse chamado lower()
cada string, como no número 3 acima. A vantagem é que os programadores não precisam se lembrar de minúsculas. Mas você precisa ler as seções "Comportamento de comparação de strings" e "Limitações" nos documentos antes de decidir usar o citext.