Existem 3 maneiras principais de realizar uma pesquisa que não diferencia maiúsculas de minúsculas no Oracle sem usar índices de texto completo.
Em última análise, o método que você escolhe depende de suas circunstâncias individuais; a principal coisa a lembrar é que, para melhorar o desempenho, você deve indexar corretamente para pesquisa que não diferencia maiúsculas de minúsculas.
1. Case sua coluna e sua string de forma idêntica.
Você pode forçar todos os seus dados a serem o mesmo caso usando
UPPER()
ou LOWER()
:select * from my_table where upper(column_1) = upper('my_string');
ou
select * from my_table where lower(column_1) = lower('my_string');
Se
column_1
não está indexado em upper(column_1)
ou lower(column_1)
, conforme apropriado, isso pode forçar uma verificação completa da tabela. Para evitar isso, você pode criar um índice baseado em função. create index my_index on my_table ( lower(column_1) );
Se você estiver usando LIKE, precisará concatenar um
%
em torno da string que você está procurando. select * from my_table where lower(column_1) LIKE lower('my_string') || '%';
Este SQL Fiddle demonstra o que acontece em todas essas consultas. Observe os Planos de Explicação, que indicam quando um índice está sendo usado e quando não está.
2. Use expressões regulares.
Do Oracle 10g em diante
REGEXP_LIKE()
está disponível. Você pode especificar o _match_parameter_ 'i'
, para realizar uma pesquisa que não diferencia maiúsculas de minúsculas. Para usar isso como um operador de igualdade, você deve especificar o início e o fim da string, que é indicada pelo quilate e pelo cifrão.
select * from my_table where regexp_like(column_1, '^my_string$', 'i');
Para executar o equivalente a LIKE, eles podem ser removidos.
select * from my_table where regexp_like(column_1, 'my_string', 'i');
Tenha cuidado com isso, pois sua string pode conter caracteres que serão interpretados de maneira diferente pelo mecanismo de expressão regular.
Este SQL Fiddle mostra a mesma saída de exemplo, exceto usando REGEXP_LIKE().
3. Altere-o no nível da sessão.
O parâmetro NLS_SORT controla a sequência de agrupamento para ordenação e os vários operadores de comparação, incluindo
=
e gosto. Você pode especificar uma classificação binária, que não diferencia maiúsculas de minúsculas, alterando a sessão. Isso significa que cada consulta realizada nessa sessão executará parâmetros que não diferenciam maiúsculas de minúsculas. alter session set nls_sort=BINARY_CI
Há muitas informações adicionais sobre classificação linguística e pesquisa de strings se você quiser especificar um idioma diferente ou fazer uma pesquisa sem distinção de sotaque usando BINARY_AI.
Você também precisará alterar o parâmetro NLS_COMP; citar:
Os operadores exatos e as cláusulas de consulta que obedecem ao parâmetro NLS_SORT dependem do valor do parâmetro NLS_COMP. Se um operador ou cláusula não obedecer ao valor NLS_SORT, conforme determinado por NLS_COMP, o agrupamento usado é BINARY.
O valor padrão de NLS_COMP é BINARY; mas, LINGUISTIC especifica que o Oracle deve prestar atenção ao valor de NLS_SORT:
As comparações de todas as operações SQL na cláusula WHERE e nos blocos PL/SQL devem usar a classificação linguística especificada no parâmetro NLS_SORT. Para melhorar o desempenho, você também pode definir o índice linguístico na coluna para a qual deseja comparações linguísticas.
Então, mais uma vez, você precisa alterar a sessão
alter session set nls_comp=LINGUISTIC
Conforme observado na documentação, você pode querer criar um índice linguístico para melhorar o desempenho
create index my_linguistc_index on my_table
(NLSSORT(column_1, 'NLS_SORT = BINARY_CI'));