Bienvenido a nuestra página, ahora hallarás la solucíon de lo que buscabas.
Solución:
Hay 3 formas principales de realizar una búsqueda que no distingue entre mayúsculas y minúsculas en Oracle sin utilizar índices de texto completo.
En última instancia, el método que elija dependerá de sus circunstancias individuales; Lo principal 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 su columna y su string idénticamente.
Puede forzar que todos sus datos sean iguales 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 un escaneo completo 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á usando LIKE, entonces debe concatenar un %
alrededor de string que estás 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. Utilice expresiones regulares.
Desde Oracle 10g en adelante REGEXP_LIKE()
está disponible. Puede especificar el _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 string, 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 de LIKE, estos se pueden eliminar.
select * from my_table where regexp_like(column_1, 'my_string', 'i');
Tenga cuidado con esto como su string puede contener caracteres que serán interpretados de manera diferente por el motor de expresiones regulares.
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 gobierna la secuencia de clasificación para ordenar y los diversos operadores de comparación, incluidos =
y, como. Puede especificar una ordenación binaria, que no distingue entre mayúsculas y minúsculas, modificando la sesión. Esto significará que cada consulta realizada en esa sesión ejecutará 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 string buscando si desea especificar un idioma diferente, o hacer una búsqueda sin acentos usando BINARY_AI.
También necesitará cambiar el parámetro NLS_COMP; 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 al valor NLS_SORT, según lo determinado por NLS_COMP, la colación utilizada es BINARY.
El valor predeterminado de NLS_COMP es BINARY; pero, LINGUISTIC especifica que Oracle debe prestar atención al valor de NLS_SORT:
Las comparaciones para todas las operaciones SQL en la cláusula WHERE y en los bloques PL / SQL deben utilizar el orden lingüístico especificado en el parámetro NLS_SORT. Para mejorar el rendimiento, también puede definir un índice lingüístico en la columna para la que desea comparaciones lingüísticas.
Entonces, una vez más, debes 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'));
Desde 10gR2, Oracle permite ajustar el comportamiento de string comparaciones estableciendo el NLS_COMP
y NLS_SORT
parámetros de sesión:
SQL> SET HEADING OFF
SQL> SELECT *
2 FROM NLS_SESSION_PARAMETERS
3 WHERE PARAMETER IN ('NLS_COMP', 'NLS_SORT');
NLS_SORT
BINARY
NLS_COMP
BINARY
SQL>
SQL> SELECT CASE WHEN 'abc'='ABC' THEN 1 ELSE 0 END AS GOT_MATCH
2 FROM DUAL;
0
SQL>
SQL> ALTER SESSION SET NLS_COMP=LINGUISTIC;
Session altered.
SQL> ALTER SESSION SET NLS_SORT=BINARY_CI;
Session altered.
SQL>
SQL> SELECT *
2 FROM NLS_SESSION_PARAMETERS
3 WHERE PARAMETER IN ('NLS_COMP', 'NLS_SORT');
NLS_SORT
BINARY_CI
NLS_COMP
LINGUISTIC
SQL>
SQL> SELECT CASE WHEN 'abc'='ABC' THEN 1 ELSE 0 END AS GOT_MATCH
2 FROM DUAL;
1
También puede crear índices que no distingan entre mayúsculas y minúsculas:
create index
nlsci1_gen_person
on
MY_PERSON
(NLSSORT
(PERSON_LAST_NAME, 'NLS_SORT=BINARY_CI')
)
;
Esta información se tomó de búsquedas de Oracle que no distinguen entre mayúsculas y minúsculas. El artículo menciona REGEXP_LIKE
pero parece funcionar con el buen viejo =
así como.
En versiones anteriores a 10gR2, realmente no se puede hacer y el enfoque habitual, si no necesita insensible al acento buscar, es solo UPPER()
tanto la columna como la expresión de búsqueda.
tal vez puedas intentar usar
SELECT user_name
FROM user_master
WHERE upper(user_name) LIKE '%ME%'