我上周一直在学习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”。
我试图对此进行研究并提出后者,但是它不起作用..我是否正确构造了代码?
我认为您可以执行以下操作:
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模式。
问题内容: 我有下表Goods_In_Wagon(Goods_ID,Wagon_ID,Total_Weight)。我需要创建一些if语句检查约束,说 “如果WAGON_ID在90到99之间,则Total_Weight必须大于10。” AND“如果WAGON_ID在100到110之间,则Total_Weight必须大于20。” AND“如果WAGON_ID在111到120之间,则Total_Weig
主要内容:选取设置检查约束的字段,在创建表时设置检查约束,在修改表时添加检查约束,删除检查约束MySQL检查约束(CHECK)是用来检查数据表中字段值有效性的一种手段,可以通过 CREATE TABLE 或 ALTER TABLE 语句实现。设置检查约束时要根据实际情况进行设置,这样能够减少无效数据的输入。 在《MySQL默认值》和《MySQL非空约束》中讲解的默认值约束和非空约束也可看作是特殊的检查约束。 选取设置检查约束的字段 检查约束使用 CHECK 关键字,具体的语法格式如下: C
主要内容:Oracle Check约束简介在本教程中,您将学习如何使用Oracle检查约束来强制域(列)的完整性。 Oracle Check约束简介 Oracle检查约束允许通过限制一列或多列所接受的值来强制执行域完整性。 要创建一个检查约束,可以定义一个返回或的逻辑表达式。 Oracle使用此表达式来验证正在插入或更新的数据。 如果表达式的计算结果为,则Oracle接受数据并进行插入或更新。 否则,Oracle将拒绝这些数据,新数据根本
我在mysql查询中使用CASE语句,我必须检查同一查询中是否存在列。 有可能这样做吗?如果是,请帮忙。 我的查询为例- 当“Status”时选择CASE column1,然后选择“Status”当“value”时(当id不为NULL时选择CASE id,然后选择“status1”,否则选择“status2”结束为table1 where condition中的ScheduleStatus)结束为
问题内容: 我继承了一个使用MySQL的应用程序,该应用程序由PHP前端使用。编写此系统的人花了相当长的时间才能确保用户输入的代码有效- tat表示这些代码也存在于另一个表中。 当我第一次看到此消息时,我想知道为什么他没有使用CHECK约束并让dbms进行解决- 我设想有很多不同的程序会实现相同的检查,而不仅仅是dbms中的一个地方。然后我发现MySQL不支持Check约束(严格来说不是真的- 它
问题内容: 我想向表中添加一列,然后添加检查约束以确保其大于0。我似乎无法使它在oracle sl开发人员中运行。 错误报告-SQL错误:ORA-00904 ::无效的标识符00904。00000-“%s:无效的标识符” 问题答案: 语法中没有子句。只是。 这是 SQLFiddle 演示