PDA

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 :).