Oracle
 sql >> Base de données >  >> RDS >> Oracle

Utilisation d'une instruction case dans une contrainte de vérification

Je pense que vous pouvez faire ce qui suit :

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' )
);

Veuillez consulter le schéma SQL Fiddle ici.

Vous n'avez pas besoin du UPPER() contrainte sur salary_grade puisque la vérification de regex suffira (vous vérifiez déjà qu'il s'agit d'une lettre majuscule entre A et G). Je ne pense pas que la contrainte sur salary_scale seule est nécessaire non plus puisqu'elle serait contenue, logiquement, dans la dernière contrainte.

MISE À JOUR

Voici comment vous pourriez le faire avec un CASE déclaration :

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 )
);

Veuillez consulter le schéma SQL Fiddle ici.