Ver la Versión Completa : Usar IIF en check
CarlosG
06-09-2011, 01:48:35
Hola, miembros del foro.
Pues tengo una pregunta acerca de utilizar iif() dentro de una restriccion check algo como:
constraint CK_UseKardex check(iif(UseKardex=1, TipoKardex is not null, TipoKardex is null))
Pues que estoy migrando desde otro Gestor de BD. a Firebird con docenas de iif() como estas pero no me funciona. Hay alguna manera de hacer esto en firebird?.
Gracias de anticipadas por sus repuestas :).
Caral
06-09-2011, 01:50:46
Hola
IIF() lo acepta Firebird, pero creo que solo dentro de un sql.
Saludos
CarlosG
06-09-2011, 01:58:10
Gracias Caral.
Pero me preguntaba si existe alguna manera de lograr el mismo objetivo dentro del check en Firebird? claro con otras funciones que permita firebird.
Caral
06-09-2011, 02:02:02
Hola
No se o no conozco el check, no lo he usado.
Saludos
PD: es pregunta para conocedores....
Caral
06-09-2011, 02:18:26
Hola
Estaba revisando aqui (http://www.firebirdsql.org/manual/nullguide-check-constraints.html) para tratar de entender esto y segun entiendo lo que hace check es devolver un valor null segun el caso.
Da la impresion, o por lo menos a mi me parece que hace algo similar al IFF, solo que creando una sola condicion de retorno.
Lo que no entiendo es: Si es asi; por que no usar el IFF directamente ?.
Solo me auto pregunto ?.
Saludos
CarlosG
06-09-2011, 02:42:58
Bueno Caral, lo que hace el check es validar una condicion logica Check(<condicion>) y hasta antes de la versión 2.0 de Firebird si la condicion se evaluaba a NULL se tomaba como False pero a partir de esta (la 2.0) se evalua a True a CHECK is now passed if the condition resolves to NULL, por lo cual es mejor asegurarse de que la <condicion> devuelva True o False y no NULL, digo por si las mosca no vaya a cambiar en el futuro! ;).
La ventaja de la de la funcion IIF es que permite hacer validaciones anidadas mas complejas y mas entedibles que si la hicieramos sin ella, pero si no hay forma de utilizar IIF o algo similar tendre que hacerlo a mano.
Gallosuarez
06-09-2011, 03:46:43
Carlos:
:confused: Pues no entiendo bien a bien que es lo que quieres hacer en el check (no entiendo tu ejemplo), pero yo he utilizado el iif muy a menudo. Te pongo un par de ejemplos:
En un campo calculado:
FULLNAME COMPUTED BY (TRIM(LASTNAME || ' ' || IIF(MOTHERSMAIDEN_NAME <> '', MOTHERS_MAIDEN_NAME || ' ', '') || FIRSTNAME));
Dentro de un procedimiento almacenado:
/* Bucle para procesar apellido(s) paterno */
WHILE (1 = 1) DO
BEGIN
PosEspacio = IIF(POSITION(' ', APaterno) = 0, 1, POSITION(' ', APaterno));
APaterno1 = SUBSTRING(APaterno FROM 1 FOR PosEspacio - 1);
IF (APaterno1 NOT IN ('DE','LA','LAS','MC','VON','DEL','LOS','Y','MAC','VAN')
OR (PosEspacio - 1) = 0) THEN LEAVE;
APaterno = SUBSTRING(APaterno FROM PosEspacio + 1);
END
Espero que te ayude mi código ...
Saludos,
Gerardo Suárez Trejo
CarlosG
06-09-2011, 05:01:06
Gracias por las repuestas :).
:confused: Pues no entiendo bien a bien que es lo que quieres hacer en el check (no entiendo tu ejemplo)
Disculpa es que lo saque rapido de mi codigo SQL DDL, y como que no se entiende muy bien . A Traducir: check(iif(UseKardex=1, TipoKardex is not null, TipoKardex is null))
condicion: UseKardex es = 1
Si es Verdadero: obligar el ingreso para el campo TipoKardex
Si es Falso: impedir que se ingrese informacion en el campo TipoKardex.
Soy nuevo en Firebird y habia creado todo mi script SQL de BD, usando checks comprobaciones a nivel de tabla con funciones IIF (pensaba que si se podia :( ) pero al probarlo no funciono, como decia CARAL no funcioma en checks, al parecer solo hay 2 opciones.
1.- Uso los Procedimientos almacenado, aunque mejor los triggers como sugiere GalloSuarez donde si puedo usar los IIFs.
2.- o sustituir los IIF por condiciones AND y OR, traduciendo el ejemplo seria: CHECK((UseKardex=1 AND TipoKardex is not null) or (UseKardex=0 AND TipoKardex is null)).
Gracias por las respuestas, tengo que corregir mi script SQL, cometiendo fallas se aprende :).
vBulletin v3.6.8, Derechos ©2000-2024, Jelsoft Enterprises Ltd.