Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Pesquisa sem distinção entre maiúsculas e minúsculas no Oracle


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'));