【发布时间】:2015-01-26 20:26:35
【问题描述】:
上周我一直在学习 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 是否在 A-D 之间,那么 salary_scale 必须是“S1”,或者如果 salary_grade 在 E-G 之间,那么它是“S2”。
我曾尝试对此进行研究并提出后者,但它不起作用..我的代码结构是否正确?
【问题讨论】:
-
你有什么错误吗?如果是这样,请更新您的问题,这可能有助于找到问题。
-
@Hugo Sousa 我在尝试删除时缺少右括号。还说表不存在
-
我真的是新手,几周前才开始学习,所以请多多包涵
-
一般来说,你不应该在允许布尔逻辑的地方使用
CASE(例如WHERE子句和检查约束)。它的预期用途是允许您在通常不允许的地方使用布尔逻辑(例如SELECT语句中的列列表)。 -
@user3414871 你已经有 3 个很好的答案了。您应该通过接受最适合您需求的那一种来给予他们信任。
标签: sql oracle oracle11g check-constraints