Ver Mensaje Individual
  #5 (permalink)  
Antiguo 01/09/2010, 08:54
Avatar de huesos52
huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 10 meses
Puntos: 360
Respuesta: constraint check like

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 original
  1. SQL> DESC ejemplo2_regexplike;
  2.  Nombre                                    Â¿Nulo?  Tipo
  3.  ----------------------------------------- -------- ----------------------------
  4.  CAMPO                                              DATE
  5.  
  6. SQL> SELECT TO_CHAR(campo,'DD/MM/YYYY') fecha FROM ejemplo2_regexplike;
  7.  
  8. FECHA
  9. ----------
  10. 01/09/2010
  11. 01/09/2009
  12. 01/09/2008
  13. 01/09/2007


Y se quiere obtener el rango de los años 2008 - 2009.
Código SQL:
Ver original
  1. SQL> SELECT *FROM ejemplo2_regexplike WHERE REGEXP_LIKE(TO_CHAR(campo, 'YYYY'), '^200[8-9]');
  2.  
  3. CAMPO
  4. --------
  5. 01/09/09
  6. 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 original
  1. SQL> SELECT *FROM ejemplo1_regexpreplace;
  2.  
  3. CAMPO
  4. --------------------------------------------------------------------------------
  5. 57_6_8852125
  6. 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 original
  1. SQL> SELECT
  2. REGEXP_REPLACE(campo,'([[:digit:]]{2})\_([[:digit:]]{1})\_([[:digit:]]{7})','(\1)-\2-\3') tel_formateado
  3. FROM ejemplo1_regexpreplace;
  4.   2    3
  5. TEL_FORMATEADO
  6. --------------------------------------------------------------------------------
  7. (57)-6-8852125
  8. (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.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming