use*_*871 3 sql oracle check-constraints oracle11g
我上周一直在学习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'))
);
Run Code Online (Sandbox Code Playgroud)
我想检查一下,如果salary_grade它在AD之间那么salary_scale必须是'S1'或者如果salary_grade它在EG之间那么它是'S2'.
我试图研究这个并提出后者但是它不起作用..我是否正确构造了代码?
我想你可以做到以下几点:
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' )
);
Run Code Online (Sandbox Code Playgroud)
您不需要UPPER()约束,salary_grade因为正则表达式检查就足够了(您已经检查以确保它是A和G之间的大写字母).我不认为salary_scale单独的约束是必要的,因为它将在逻辑上包含在最后一个约束中.
UPDATE
您可以通过以下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 )
);
Run Code Online (Sandbox Code Playgroud)
Acase必须与某物进行比较,这就是为什么您会收到缺少右括号错误的原因。除非你特别想要一个case,否则你可以用 and/or 检查组合:
CONSTRAINT ck_grade_scale CHECK(
(salary_grade BETWEEN 'A' AND 'D' AND salary_scale = 'S1')
OR (salary_grade BETWEEN 'D' AND 'G' AND salary_scale = 'S2')),
Run Code Online (Sandbox Code Playgroud)
正如 Parado 所说,您不能使用约束来有条件地设置列值,而只能限制它们。您可以使用虚拟列进行缩放,但这意味着将查找表的一部分而不是数据放入 DDL 中,这看起来有点奇怪。
| 归档时间: |
|
| 查看次数: |
7057 次 |
| 最近记录: |