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
