Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

constraint check like

Estas en el tema de constraint check like en el foro de Oracle en Foros del Web. Buen dia a todos, si alguien me puede ayudar tengo que hacer una restriccion en un campo codigo de vendedor que empieze con la letra ...
  #1 (permalink)  
Antiguo 31/08/2010, 09:39
 
Fecha de Ingreso: agosto-2010
Mensajes: 2
Antigüedad: 14 años, 3 meses
Puntos: 0
constraint check like

Buen dia a todos, si alguien me puede ayudar tengo que hacer una restriccion en un campo codigo de vendedor que empieze con la letra V y los cuatro siguientes digitos sean solo numeros. ( el campos el codven char(5) )

alter table vendedor
add constraint ck_codvendedor
check (codven like 'V[0-9][0-9][0-9][0-9]')

no funciona alguien me puede ayudar . . .
  #2 (permalink)  
Antiguo 31/08/2010, 09:48
Avatar de 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

Pruebalo así:

Código SQL:
Ver original
  1. ALTER TABLE vendedor
  2. ADD CONSTRAINT ck_codvendedor
  3. CHECK (REGEXP_LIKE(codven,'V[0-9][0-9][0-9][0-9]'));

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 31/08/2010, 15:19
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 6 meses
Puntos: 43
Respuesta: constraint check like

Matanga, ¿ puedes ampliar un poco lo de REGEXP_LIKE ?

Me dá que puede ir a mi directorio de sql super-utiles

Un saludazo compi.
  #4 (permalink)  
Antiguo 01/09/2010, 00:48
 
Fecha de Ingreso: agosto-2010
Mensajes: 2
Antigüedad: 14 años, 3 meses
Puntos: 0
Respuesta: constraint check like

Listo me sirvio mucho la info ahora si valida la restriccion gracias.......
  #5 (permalink)  
Antiguo 01/09/2010, 08:54
Avatar de 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
  #6 (permalink)  
Antiguo 02/09/2010, 01:52
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 6 meses
Puntos: 43
Respuesta: constraint check like

Cita:
Iniciado por huesos52 Ver Mensaje
jc3000, no se si te refieres a matanga o a mi que dí la respuesta
Perdona tio ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡

Me refería a ti. Tenía varias ventanas abiertas viendo el tuyo y otro de Matanga y se me fué la pinza.

Gracias por tu aporte, directo a mis sql's

Etiquetas: constraint
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:29.