Oracle
 sql >> Database >  >> RDS >> Oracle

Utilizzo di un'istruzione case in un vincolo di controllo

Penso che tu possa fare quanto segue:

CREATE TABLE Grade
(
  salary_grade    char(1) NOT NULL CHECK (REGEXP_LIKE(salary_grade, '[A-G]', 'c')),
  salary_scale    char(2) DEFAULT 'S1' NOT NULL,
  CONSTRAINT pk_grade PRIMARY KEY (salary_grade),
  CONSTRAINT ck_grade_scale CHECK ( REGEXP_LIKE(salary_grade, '[A-D]', 'c') AND salary_scale = 'S1'
                                 OR REGEXP_LIKE(salary_grade, '[E-G]', 'c') AND salary_scale = 'S2' )
);

Vedi lo schema SQL Fiddle qui.

Non hai bisogno di UPPER() vincolo su salary_grade poiché il controllo regex sarà sufficiente (stai già controllando per assicurarti che sia una lettera maiuscola tra A e G). Non credo che il vincolo su salary_scale da solo è necessario sia perché sarebbe contenuto, logicamente, nell'ultimo vincolo.

AGGIORNAMENTO

Ecco come puoi farlo con un CASE dichiarazione:

CREATE TABLE Grade
(
  salary_grade    char(1) NOT NULL CHECK (REGEXP_LIKE(salary_grade, '[A-G]', 'c')),
  salary_scale    char(2) DEFAULT 'S1' NOT NULL,  
  CONSTRAINT pk_grade PRIMARY KEY (salary_grade),
  CONSTRAINT ck_grade_scale CHECK ( salary_scale = CASE WHEN REGEXP_LIKE(salary_grade, '[A-D]', 'c') THEN 'S1' ELSE 'S2' END )
);

Vedi lo schema SQL Fiddle qui.