Jeg tror, du kan gøre følgende:
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' )
);
Se venligst SQL Fiddle-skemaet her.
Du behøver ikke UPPER()
begrænsning på salary_grade
da regex-kontrollen vil være tilstrækkelig (du tjekker allerede for at sikre, at det er et stort bogstav mellem A og G). Jeg tror ikke, at begrænsningen på salary_scale
alene er nødvendigt, da det logisk set ville være indeholdt i den sidste begrænsning.
OPDATERING
Her er hvordan du kan gøre det med en CASE
erklæring:
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 )
);
Se venligst SQL Fiddle-skemaet her.