Oracle – Buscar texto en múltiples columnas sin tomar en cuenta las mayúsculas o los acentos

agosto 18, 2010

En un proyecto me solicitaron que realizará una “búsqueda universal” sobre un conjunto de registros, es decir, ingresar algunas palabras y que el sistema encuentre los que coincidan en cualquiera de sus campos (solo los de tipo texto obviamente). Bueno, pues encontré dos problemas: comparar múltiples columnas y los acentos y la capitalización.

El primer problema lo resolvemos con sentencias “OR”
Ejemplo:

SELECT *
FROM TCORRESPONDENCIAS
WHERE
  SEMITIDO LIKE ‘%CONSEJO%’
  OR SDIRIGIDOA LIKE ‘%CONSEJO%’
  OR SCOMENTARIOS LIKE ‘%CONSEJO%’;

El segundo problema lo resolvemos alterando las preferencias de la sesión -está dura el tiempo que tengamos abierta la conexión-. Cuando ejecutamos sentencias SQL desde nuestros programas es recomendable cerrar la conexión inmediatamente después (aunque la mayoría de librerías implementa un “pool” de conexiones y esto no suceda en realidad), entonces tendríamos que modificar la sesión cada vez que ejecutemos la consulta.
Para que las comparaciones de cadena se hagan sin tomar en cuenta los acentos o la capitalización, ejecuta primero los siguientes comandos:

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

Luego realiza tu búsqueda normalmente. Ejemplos:

SELECT *
FROM TCORRESPONDENCIAS
WHERE
  SEMITIDO LIKE ‘%direccion%’;

SELECT *
FROM TCORRESPONDENCIAS
WHERE
  SEMITIDO LIKE ‘%Dirección%’;

SELECT *
FROM TCORRESPONDENCIAS
WHERE
  SEMITIDO LIKE ‘%DIRECCIÓN%’;

estas 3 consultas devolverán los mismos registros.

Un tercer problema sería buscar varias palabras. Aquí depende si quieres que los resultados contengan todas las palabras (AND) o sólo alguna de ellas (OR), podemos utilizar la función REGEXP_LIKE en vez de LIKE para que nos quede en una sola línea

EJEMPLO “OR” (alguna palabra en algun campo)

SELECT *
FROM TCORRESPONDENCIAS
WHERE
  REGEXP_LIKE(SDIRIGIDOA, ‘.*CONSEJO.*|.*JUDICATURA.*’)
  OR REGEXP_LIKE(SCOMENTARIOS, ‘.*CONSEJO.*|.*JUDICATURA.*’);

EJEMPLO “AND” (todas las palabras en algun campo)

SELECT *
FROM TCORRESPONDENCIAS
WHERE
  (REGEXP_LIKE(SDIRIGIDOA, ‘.*CONSEJO.*’)
  AND REGEXP_LIKE(SDIRIGIDOA, ‘.*JUDICATURA.*’))
  OR
  (REGEXP_LIKE(SCOMENTARIOS, ‘.*CONSEJO.*’)
  AND REGEXP_LIKE(SCOMENTARIOS, ‘.*JUDICATURA.*’));

Fuentes:
http://oracle.ittoolbox.com/
http://www.orasite.com/tutoriales/

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: