Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Verwenden einer Case-Anweisung in einer Check-Einschränkung

Ich denke, Sie können Folgendes tun:

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

Bitte sehen Sie sich das SQL-Fiddle-Schema hier an.

Sie brauchen das UPPER() nicht Beschränkung auf salary_grade da die Regex-Prüfung ausreicht (Sie prüfen bereits, ob es sich um einen Großbuchstaben zwischen A und G handelt). Ich glaube nicht, dass die Beschränkung auf salary_scale alleine ist auch notwendig, da es logischerweise in der letzten Bedingung enthalten wäre.

AKTUALISIEREN

So könnten Sie es mit einem CASE machen Aussage:

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

Bitte sehen Sie sich das SQL-Fiddle-Schema hier an.