2012-05-23 1 views

Répondre

5

les opérations suivantes:

ALTER TABLE eni_trasc_voci_pwr_fatt 
ADD CONSTRAINT tvp_constraint_1 CHECK (
CASE WHEN TVP_CODICE_ASSOGGETAMEN = '-' THEN tvp_regione else null end IS NULL); 
+1

+1. Vous pouvez le rendre encore plus court en supprimant 'else null'. –

+1

Vous avez raison. Mais mon intention était de décrire un "Case when" -Statement complet, parce que celui-là dans la question était totalement faux. – int2000

3

On dirait que vous voulez ici l'implication logique ("si X alors Y"), qui est logiquement équivalent à "(non X) ou Y". CASE est utilisé pour créer une carte finie.

Votre contrainte doit être quelque chose comme

TVP_CODICE_ASSOGGETAMEN != '-' OR TVP_REGIONE IS NULL

+0

Math à la rescousse. +1 – toquart

2

Je pense que vous pouvez faire ce que vous voulez sans la déclaration de cas:

create table t1 (c1 varchar2(10), c2 varchar2(10)); 

alter table t1 add constraint t1_chk1 check ((c1 = '-' and c2 is null) or (c1 != '-' and c2 is not null)); 

maintenant essayer d'insérer des valeurs:

SQL> insert into t1 values ('-', 'reject'); 
insert into t1 values ('-', 'reject') 
* 
ERROR at line 1: 
ORA-02290: check constraint (SODONNEL.T1_CHK1) violated 


SQL> 
SQL> insert into t1 values ('-', null); 

1 row created. 

SQL> 
SQL> insert into t1 values ('a', null); 
insert into t1 values ('a', null) 
* 
ERROR at line 1: 
ORA-02290: check constraint (SODONNEL.T1_CHK1) violated 


SQL> 
SQL> insert into t1 values ('a', 'accept'); 

1 row created.