Мисля, че можете да направите следното:
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' )
);
Моля, вижте схемата на SQL Fiddle тук.
Нямате нужда от UPPER()
ограничение за salary_grade
тъй като проверката на регулярния израз ще е достатъчна (вече проверявате, за да сте сигурни, че е главна буква между A и G). Не мисля, че ограничението за salary_scale
само е необходимо или тъй като би се съдържало, логично, в последното ограничение.
АКТУАЛИЗАЦИЯ
Ето как можете да го направите с CASE
изявление:
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 )
);
Моля, вижте схемата на SQL Fiddle тук.