小编典典

在检查约束中使用case语句

sql

我上周一直在学习SQL,但是我不确定如何在检查约束中正确添加case语句。有人可以给我指点吗?

我有以下成绩表:

CREATE TABLE Grade
(
    salary_grade    char(1) NOT NULL CHECK (salary_grade = UPPER(salary_grade)),
        CONSTRAINT ck_grade_scale CHECK(
        CASE 
            WHEN salary_grade = '[A-D]' 
                THEN salary_scale = 'S1'
            WHEN salary_grade = '[D-G]' 
                THEN salary_scale = 'S2'
        END)

        salary_scale    char(2) DEFAULT 'S1' NOT NULL,

        CONSTRAINT pk_grade PRIMARY KEY (salary_grade),
        CONSTRAINT ck_salary_grade CHECK (REGEXP_LIKE(salary_grade, '[A-G]', 'c')),
        --constraint must be either S1 or S2
        CONSTRAINT ck_salary_scale CHECK (salary_scale IN ('S1', 'S2'))
);

我想检查是否salary_grade在AD之间,则salary_scale必须为“ S1”,或者是否salary_grade在EG之间,则为“
S2”。

我试图对此进行研究并提出后者,但是它不起作用..我是否正确构造了代码?


阅读 231

收藏
2021-04-22

共1个答案

小编典典

我认为您可以执行以下操作:

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模式。

2021-04-22