sql >> Base de Datos >  >> RDS >> Oracle

Búsqueda insensible a mayúsculas y minúsculas en Oracle

Hay 3 formas principales de realizar una búsqueda que no distingue entre mayúsculas y minúsculas en Oracle sin usar índices de texto completo.

En última instancia, el método que elija depende de sus circunstancias individuales; lo más importante que debe recordar es que para mejorar el rendimiento debe indexar correctamente para la búsqueda que no distingue entre mayúsculas y minúsculas.

1. Ponga mayúsculas y minúsculas en su columna y su cadena.

Puede forzar que todos sus datos sean el mismo caso usando UPPER() o LOWER() :

select * from my_table where upper(column_1) = upper('my_string');

o

select * from my_table where lower(column_1) = lower('my_string');

Si column_1 no está indexado en upper(column_1) o lower(column_1) , según corresponda, esto puede forzar una exploración completa de la tabla. Para evitar esto, puede crear un índice basado en funciones.

create index my_index on my_table ( lower(column_1) );

Si está utilizando LIKE, debe concatenar un % alrededor de la cadena que está buscando.

select * from my_table where lower(column_1) LIKE lower('my_string') || '%';

Este SQL Fiddle demuestra lo que sucede en todas estas consultas. Tenga en cuenta los planes de explicación, que indican cuándo se está utilizando un índice y cuándo no.

2. Usa expresiones regulares.

Desde Oracle 10g en adelante REGEXP_LIKE() está disponible. Puede especificar el _match_parameter_ 'i' , para realizar una búsqueda que no distinga entre mayúsculas y minúsculas.

Para utilizarlo como operador de igualdad, debe especificar el inicio y el final de la cadena, que se indica con el quilate y el signo de dólar.

select * from my_table where regexp_like(column_1, '^my_string$', 'i');

Para realizar el equivalente a LIKE, estos pueden eliminarse.

select * from my_table where regexp_like(column_1, 'my_string', 'i');

Tenga cuidado con esto, ya que su cadena puede contener caracteres que el motor de expresiones regulares interpretará de manera diferente.

Este SQL Fiddle le muestra el mismo resultado de ejemplo, excepto que usa REGEXP_LIKE().

3. Cámbielo a nivel de sesión.

El parámetro NLS_SORT rige la secuencia de clasificación para ordenar y los diversos operadores de comparación, incluido = y, como. Puede especificar una ordenación binaria que no distinga entre mayúsculas y minúsculas modificando la sesión. Esto significará que cada consulta realizada en esa sesión realizará parámetros que no distinguen entre mayúsculas y minúsculas.

alter session set nls_sort=BINARY_CI

Hay mucha información adicional sobre la clasificación lingüística y la búsqueda de cadenas si desea especificar un idioma diferente o realizar una búsqueda sin distinción de acentos mediante BINARY_AI.

También deberá cambiar el parámetro NLS_COMP; para citar:

Los operadores exactos y las cláusulas de consulta que obedecen al parámetro NLS_SORT dependen del valor del parámetro NLS_COMP. Si un operador o cláusula no obedece el valor NLS_SORT, según lo determinado por NLS_COMP, la intercalación utilizada es BINARIA.

El valor predeterminado de NLS_COMP es BINARIO; pero, LINGUISTIC especifica que Oracle debe prestar atención al valor de NLS_SORT:

Las comparaciones de todas las operaciones de SQL en la cláusula WHERE y en los bloques PL/SQL deben utilizar la ordenación lingüística especificada en el parámetro NLS_SORT. Para mejorar el rendimiento, también puede definir el índice lingüístico en la columna para la que desea comparaciones lingüísticas.

Entonces, una vez más, debe modificar la sesión

alter session set nls_comp=LINGUISTIC

Como se indica en la documentación, es posible que desee crear un índice lingüístico para mejorar el rendimiento

create index my_linguistc_index on my_table 
   (NLSSORT(column_1, 'NLS_SORT = BINARY_CI'));