El comportamiento predeterminado de LIKE
y los otros operadores de comparación, =
etc. distingue entre mayúsculas y minúsculas.
¿Es posible hacerlos insensibles a mayúsculas y minúsculas?
sql
oracle
case-sensitive
case-insensitive
sql-like
sergionni
fuente
fuente
REGEXP_LIKE(username,'me','i')
lugar de LIKE?Respuestas:
Desde 10gR2, Oracle permite ajustar el comportamiento de las comparaciones de cadenas configurando los parámetros de sesión
NLS_COMP
yNLS_SORT
:También puede crear índices sin distinción entre mayúsculas y minúsculas:
Esta información fue tomada de búsquedas insensibles a mayúsculas y minúsculas de Oracle . El artículo menciona,
REGEXP_LIKE
pero parece funcionar con buenos viejos=
también.En versiones anteriores a 10gR2, realmente no se puede hacer y el enfoque habitual, si no necesita una búsqueda insensible al acento , es solo
UPPER()
la columna y la expresión de búsqueda.fuente
LIKE
expresiones arbitrarias (pWHERE foo LIKE '%abc%'
. Ej. ) Ya son lo suficientemente lentas si no pueden indexarse, no creo que esté específicamente relacionado con mayúsculas y minúsculas.DBD::Oracle
, puede escribir$ENV{NLS_SORT} = 'BINARY_CI'; $ENV{NLS_COMP} = 'LINGUISTIC';
antes de llamar a `DBI-> connect`.ALTER SESSION
solo altera su instancia local de la corrección y significa que es como su sesión actual, es decir, si cierro y vuelvo a abrir, se habría restablecido. ¿Hay alguna manera de que pueda ver cuáles son los valores actuales para que si persiste en todas partes pueda volver a la configuración original ...Hay 3 formas principales de realizar una búsqueda sin distinción 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 principal que debe recordar es que para mejorar el rendimiento debe indexar correctamente las búsquedas que no distinguen entre mayúsculas y minúsculas.
1. Coloque su columna y su cadena de manera idéntica.
Puede forzar que todos sus datos sean el mismo caso usando
UPPER()
oLOWER()
:o
Si
column_1
no está indexadoupper(column_1)
olower(column_1)
, según corresponda, esto puede forzar un escaneo completo de la tabla. Para evitar esto, puede crear un índice basado en funciones .Si usa LIKE, debe concatenar una
%
cadena alrededor de la cadena que está buscando.Este SQL Fiddle demuestra lo que sucede en todas estas consultas. Tenga en cuenta los planes de explicación, que indican cuándo se utiliza un índice y cuándo no.
2. Usa expresiones regulares.
A partir de Oracle 10g en adelante
REGEXP_LIKE()
está disponible. Puede especificar _match_parameter_'i'
para realizar búsquedas que no distinguen entre mayúsculas y minúsculas.Para usar esto como un operador de igualdad, debe especificar el inicio y el final de la cadena, que se denota por el quilate y el signo de dólar.
Para realizar el equivalente de LIKE, estos se pueden eliminar.
Tenga cuidado con esto ya que su cadena puede contener caracteres que serán interpretados de manera diferente por el motor de expresión regular.
Este Fiddle de SQL 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 gobierna la secuencia de clasificación para ordenar y los diversos operadores de comparación, incluidos
=
y LIKE. Puede especificar un orden binario, sin distinción entre mayúsculas y minúsculas, ordenando alterando 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.Hay mucha información adicional sobre la clasificación lingüística y la búsqueda de cadenas si desea especificar un idioma diferente, o hacer una búsqueda insensible al acento usando BINARY_AI.
También deberá cambiar el parámetro NLS_COMP ; citar:
El valor predeterminado de NLS_COMP es BINARY; pero, LINGUISTIC especifica que Oracle debe prestar atención al valor de NLS_SORT:
Entonces, una vez más, necesitas alterar la sesión
Como se señala en la documentación, es posible que desee crear un índice lingüístico para mejorar el rendimiento
fuente
select * from my_table where lower(column_1) LIKE lower('my_string') || '%';
lugar deselect * from my_table where lower(column_1) LIKE lower('my_string%');
? ¿Le da alguna ventaja?regexp_like
, ¿hay alguna forma de escapar de tales cadenas? Dando un ejemplo, si la cadena tiene $, la salida no será la que esperamos. // cc @Ben y otros, por favor comparte.`
es el personaje de escape @bozzmob. No debería haber ninguna diferencia en la salida si la cadena en la que opera la expresión regular contiene a$
, esto solo puede causar problemas si necesita un$
literal en su expresión regular. Si tiene un problema específico, haría otra pregunta si este comentario / respuesta no ha ayudado.tal vez puedas intentar usar
fuente
WHERE upper(user_name) LIKE UPPER('%ME%')
entonces? :)UPPER
también el parámetro de entrada?upper
función pierde el índice, ¿tiene alguna idea de cómo hacer una búsqueda usando el índice?Desde Oracle 12c R2 puedes usar
COLLATE operator
:Manifestación:
db <> demostración de violín
fuente
fuente
%
's en el primer argumento a su segundo noNLSSORT
están destinados a ser comodines, ¿verdad? Se confunden un poco.puedes hacer algo así:
fuente