Espacio de tecnologia, software libre y sus derivados. Una horda de monos entrenados escriben de vez en cuando por aqui algunas noticias, opiniones e incluso alguna que otra cosa fuera del tema. Maqueros, favor de abstenerse que no somos lo suficientemente guapos.

Piano daemon

Escribiendo mejor SQL usando Expresiones regulares

Las expresiones regulares son una caracteristica de la base de datos Oracle version 10g, esto es una poderosa herramienta para la manipulacion de datos.

Esta caracteristica mejora la habilidad de busqueda y manipulacion de caracteres de datos. Ya que a mi ver te da mucho mas flexibilidad que los existentes comodines que brinda LIKE.

Algunos ejemplos basicos:

El operador REGEXP_LIKE
En esta consulta SQL se mostraran solo las filas de codigo postal que contengan todo lo contrario a un digito numero:

-- In the USA zip code is like a Codigo postal in Mexico
SELECT zip
FROM zipcode
WHERE REGEXP_LIKE(zip, '[^[:digit:]]')
ZIP
-----
ab123
123xy
007ab
abcxy



La funcion REGEXP_INSTR
Esta funcion retorna la posicion del patron, entonces esto se vuelve mucho mas conveniente que la tradicional funcion INSTR.

El siguiente ejemplo retorna la posicion donde inicia el codigo postal de 5 digitos

SELECT
REGEXP_INSTR('Joe Smith, 10045 Berry Lane, San Joseph,
CA 91234',
       '[[:digit:]]{5}$')
       AS rx_instr
  FROM dual
  RX_INSTR
----------
        45



La funcion REGEXP_SUBSTR
Esta funcion extrae parte de la cadena.

SELECT
-- Aplicandole esta expresion regular , [^,]*,
REGEXP_SUBSTR('first field, second field , third field', ', [^,]*,')
-- usamos la tabla dual.. recuerda que no existe
FROM dual
REGEXP_SUBSTR('FIR
------------------
, second field   ,



La funcion REGEXP_REPLACE
Primero demos un vistazo a la funcion SQL tradicional REPLACE, la cual sustitulle una cadena por otra. En este caso ejemplo asumimos que los datos extrañamente tienen espacios en el texto
y te gustaria remplazar estos con un solo espacio. Con la funcion REPLACE, tu tendrias que listar exactamente cuantos espacios quieres remplazar, ademas deberas tener en cuenta, que no podria ser el mismo numero de espacios extra en cada texto.

SELECT REPLACE('Joe   Smith','  ', ' ')
       AS replace
  FROM dual
REPLACE
---------
Joe Smith



Pero si usas la funcion REGEXP_REPLACE puedes generar una solucion mas especifica para tu problematica.

SELECT REGEXP_REPLACE('Joe   Smith',
       '( ){2,}', ' ')
       AS RX_REPLACE
  FROM dual
RX_REPLACE
----------
Joe Smith

Comenta