Cita: Matanga, ¿ puedes ampliar un poco lo de REGEXP_LIKE ?
Me dá que puede ir a mi directorio de sql super-utiles
Un saludazo compi.
jc3000, no se si te refieres a matanga o a mi que dí la respuesta
Sin embargo, trataré de explicar un poco el tema.
Oracle maneja expresiones regulares que cumplen el principio basico para casi todos los lenguajes de programación y motores de bases de datos. Sin embargo, tiene unos componentes adicionales que pueden resultar muy utiles en ciertos casos.
REGEXP_LIKE
REGEXP_SUBSTR
REGEXP_INSTR
REGEXP_REPLACE
REGEXP_COUNT (A partir de la 11g)
Para mas info.
http://download.oracle.com/docs/cd/B....htm#ADFNS1003
Entonces... la que mas se utiliza es la regexp_like ya que trae ventajas muy grandes a la hora de hacer busquedas
que respondan un patron que resulta imposible con LIKE en determinado campo.
Por ejemplo...
Para un rango de fechas.
Si se tiene:
Código SQL:
Ver originalSQL> DESC ejemplo2_regexplike;
Nombre ¿Nulo? Tipo
----------------------------------------- -------- ----------------------------
CAMPO DATE
SQL> SELECT TO_CHAR(campo,'DD/MM/YYYY') fecha FROM ejemplo2_regexplike;
FECHA
----------
01/09/2010
01/09/2009
01/09/2008
01/09/2007
Y se quiere obtener el rango de los años 2008 - 2009.
Código SQL:
Ver originalSQL> SELECT *FROM ejemplo2_regexplike WHERE REGEXP_LIKE(TO_CHAR(campo, 'YYYY'), '^200[8-9]');
CAMPO
--------
01/09/09
01/09/08
El caracter ^ indica que el 2 debe ser el patrón que dee corresponder al principio de la cadena. Los numeros entre
corchetes indican el rango de valores aceptados para ese patrón. Es por esto, que excluye a el 7 y el 0 de las fechas
existentes en la tabla.
No soy un experto en el tema, pero dependiendo de los patrones de busqueda me toma mucho tiempo identificar que caracteres
y en que orden se deben utilizar.
Otro caso en el que me fue muy util las expresiones regulares, fue para darle formato a unos numeros telefonicos registrados en un campo.
Por ejemplo:
Código SQL:
Ver originalSQL> SELECT *FROM ejemplo1_regexpreplace;
CAMPO
--------------------------------------------------------------------------------
57_6_8852125
57_6_8841215
En colombia, el 57 es el indicativo del pais, el 6 es el indicativo de la ciudad, por ultimo, el resto del numero es
el numero de telefono utilizado.
Con esta expresión puede lograrse algo así:
Código SQL:
Ver originalSQL> SELECT
REGEXP_REPLACE(campo,'([[:digit:]]{2})\_([[:digit:]]{1})\_([[:digit:]]{7})','(\1)-\2-\3') tel_formateado
FROM ejemplo1_regexpreplace;
2 3
TEL_FORMATEADO
--------------------------------------------------------------------------------
(57)-6-8852125
(57)-6-8841215
Donde se establecen los patrones con el numero de digitos por cada separación y el formato que se desea mostrar
con el numero.
esta es una pagina con buenos ejemplos y una buena explicación de los caracteres utilizados en expresiones. El tema
es denso y por lo menos a mi me ha quitado mucho tiempo en operaciones muy basicas, pero definitivamente el potencial es alto.