1. OBJETIVO
  2. El objetivo de este documento es mostrar cómo parametrizar la base de datos oracle para que se puedan realizar búsquedas en una base de datos ORACLE 10g, siendo sensible esta búsqueda a mayúsculas y a minúsculas y distinguiendo también los acentos.


  3. INTRODUCCIÓN
  4. Las operaciones dentro de una base de datos oracle siempre son sensibles a mayúsculas, minúsculas y a los acentos. Algunas veces es necesario realizar búsquedas que no sean sensibles a mayúsculas y minúsculas y realizar comparaciones sin tener en cuenta los acentos.

    En las versiones anteriores de base de datos, este “problema” se tenía que solventar utilizando las funciones NLS_UPPER y NLS_LOWER . Estas funciones cambiaban la palabra buscada de mayúsculas a minúsculas (o viceversa) para poder realizar este tipo de búsquedas.

    Estas dos funciones  pueden ser incómodas a la hora de utilizarlas puesto que necesitan usarse en la lógica del programa en casa búsqueda. Una solución parcial a este problema se obtuvo en la versión ORACLE9i Release 2(9.2), usando la búsqueda mediante GENERIC_BASELETTER el cual agrupa todos los caracteres basados en el “valor base”.


  5. EJEMPLO DE BUSQUEDAS EN ORACLE 10G
  6. Pongamos un ejemplo para ver cómo realizar esta búsqueda pudiendo distinguir entre mayúsculas, minúsculas y acentos.

    Vamos a crear una tabla denominada persona con un único atributo denominado nombre y vamos a introducir los siguientes datos:

    CREATE TABLE persona (nombre VARCHAR2(20));
    INSERT INTO persona VALUES (‘RAMON’);
    INSERT INTO persona VALUES (‘Ramón’);
    INSERT INTO persona VALUES (‘RAMon’);
    INSERT INTO persona VALUES (‘ramón’);
    INSERT INTO persona VALUES (‘ramon’);


    Ahora con los valores por defecto que tiene la base de datos realizamos una búsqueda:

    SELECT nombre FROM persona where nombre = ‘RAMON’
    -------------------------------------------------
    RAMON


    Como observamos, en este caso no se ha hecho distinción entre mayúsculas y minúsculas y sólo se obtiene el resultado idéntico a nuestra comparación. Como hemos dicho en algunos casos es necesario obtener todos los demás datos sin tener en cuenta si es mayúscula o minúscula o que contenga acentos. Para ellos vamos a realizar las siguientes modificaciones en nuestra sesión:

    ALTER SESSION SET NLS_COMP=ANSI;
    ALTER SESSION SET NLS_SORT=GENERIC_BASELETTER;


    Una vez realizados estos cambios realizamos la misma consulta que hemos hecho antes:

    SELECT nombre FROM persona where nombre = ‘RAMON’
    -------------------------------------------------
    RAMON
    Ramón
    RAMon
    ramón
    ramon


    Todas estas anotaciones funcionan cuando utilizamos expresiones de igualdad, si queremos utilizar el operador like, lo anteriormente explicado no sirve puesto que no está soportado.
    No obstante si queremos realizar búsquedas utilizando like y que sean case- insensitive habría que utilizar la función REGEXP_LIKE con las modificaciones anteriormente explicadas.


    Ejemplo de regexp_like:

    SELECT  nombre FROM persona WHERE regexp_like ( name,’Ramon’);


Escribe un comentario:

Autor:

Comentarios:

por Anónimo | 6/25/2007 3:51:32 PM

RE: Búsquedas en Oracle 10g (case-insensitive / accent-insensitive)


Muy bueno !!


por jsalamec | 3/27/2008 9:00:57 PM

RE: Búsquedas en Oracle 10g (case-insensitive / accent-insensitive)

Después del Primer Select Se Escribió :
- Como observamos, en este caso no se ha hecho distinción entre mayúsculas y minúsculas y sólo se obtiene el resultado idéntico a nuestra comparación.
Debería Ser :
- Como observamos, en este caso SI se ha hecho distinción entre mayúsculas y minúsculas y sólo se obtiene el resultado idéntico a nuestra comparación.

Si no Se Hiciera distinción Seleccionaría Todo.

Aparte de ese pequeño detalle, me pareció excelente el Tip

por Mali | 7/16/2008 4:35:39 PM

RE: Búsquedas en Oracle 10g (case-insensitive / accent-insensitive)

Muchas gracias!! Hacía horas que buscaba algo así. Por fin podré hacer un buscador como dios manda.

por embahia | 7/21/2008 10:10:22 AM

RE: Búsquedas en Oracle 10g (case-insensitive / accent-insensitive)

Hola, una pregunta

¿Habría alguna forma de recuperar en una consulta todos los valores distintos a excepción de aquellos que se diferecien en mayusculas o minusculas o por los acentos?
Me explico:
Si yo tengo: Ramón
ramon
RAMON
RANON

que el resultado de la búsqueda fuese RANON.

Muchas gracias.

por David | 11/4/2008 4:16:15 AM

RE: Búsquedas en Oracle 10g (case-insensitive / accent-insensitive)

He aplicado esto en Oracle 10g añadiendo un índice de esta manera:

create index
IX_USUARIOS_NICK
on
USUARIOS
(
nlssort( NICK, 'NLS_SORT=BINARY_CI')
)

Luego las consultas case-insensitive las hago ejecutando antes "ALTER SESSION SET NLS_COMP=ANSI" dentro de una transacción. En coldfusion así:

<cftransaction>
<cfquery datasource="#datasource#">
ALTER SESSION SET NLS_COMP=ANSI
</cfquery>
<cfquery datasource="#datasource#">
ALTER SESSION SET NLS_SORT=BINARY_CI
</cfquery>
<cfquery name="q" datasource="#datasource#">
SELECT *
FROM USUARIOS
WHERE NICK = 'ramon'
</cfquery>
</cftransaction>

Las primeras 2 consultas dentro de la transacción se pueden omitir dependiendo si queremos filtrar, ordenar o ambas cosas.

por SIMON MENDEZ | 8/26/2009 8:57:53 AM

RE: Búsquedas en Oracle 10g (case-insensitive / accent-insensitive)

Pregunta
Pero no existe ninguna funcion en oracle para :
1-.Una base de datos quede como insensitve
o
2-.Una tabla especifica quede insensitive

Un comando o swiche, que se le mueva la base datos a las tabas?

Gracias por su respuestas

por Alejandro Ñañez Ortiz | 2/28/2010 3:40:49 PM

RE: Búsquedas en Oracle 10g (case-insensitive / accent-insensitive)

Por qué no utiliza

SELECT nombre FROM persona WHERE regexp_like ( name,'Ramon', ' i ' ) ;

Con eso realiza busquedas Case-insensitive sin necesidad de modificar la BD

por David | 4/6/2010 1:08:43 AM

RE: Búsquedas en Oracle 10g (case-insensitive / accent-insensitive)

Ahí tienes que ver qué valoras más, el no cambiar la base de datos o la rapidez que te da el índice (con el regexp_like no puedes usar índices).



Buscar errores de Oracle


Buscar en la web

 
Web orasite.com
· Tutoriales
- Export / Import Oracle 9i
- Instalación Oracle 10g
- Archivos de configuración de red para Oracle
- Administración de usuarios
- Export Oracle 10g
- init.ora spfile.ora fichero de parámetros oracle
- Configurar modo archivelog
- Introducción Oracle 10g
- Arrancar o parar base de datos Oracle
- Tunning Oracle
- Seguridad listener Oracle 10g
- Instalación statspack
- Parámetros memoria SGA
- Activar auditoria de la base de datos
- Oracle Jobs (9i)
- Controlar espacio tablespaces
- Hotbackup de una base de datos Oracle
- Búsquedas en Oracle 10g case-insensitive
- Recover database until time
- Privilegios sysoper y sysdba
- Consultas sobre V$
- Bloquear acceso a base de datos por IP
- Problemas Oracle Jobs
- Cambiar ubicación base de datos
- Reconstrucción de índices
- Encriptación e integridad de datos en Oracle
- Configuración de memoria
- Instalación de la máquina virtual Java
- Loadjava y Dropjava en Oracle
- Cambiar a modo restricted session
- Recuperación modo noarchivelog
 
· Oracle FAQ
- Oracle database
 
· Noticias
- Oracle OpenWorld 2009
- Oracle compra Sun
- Oracle 11g presentada
- Oracle vulnerable a inyección SQL en cursores
- Procesos de negocio con Oracle
- OracleXE para Debian
 
· Descargas
- Free Toad
 
· Errores Oracle
· Libros sobre Oracle
· Sitios relacionados
- Trabajos de Oracle
- ZonaOracle.com
- AjpdSoft
- La Web del Programador
· Sitios recomendados
- Cronica24.com
- TPV
- Buscar trabajo
Los contenidos de esta web son producto de la colaboración de sus usuarios, por lo que puede haber erratas. Si encuentras una información incorrecta agradeceremos que nos lo comuniques en nuestra dirección:
Cualquier información aquí publicada es de libre distribución, siempre y cuando se haga referencia mediante un link al documento original.
Orasite.com