SQL进阶第一章-----CASE表达式之CHECK约束 & 使用CASE表达式在Update语句里面进行条件分支
用CHECK约束定义多个列的条件关系
假设某个公司规定“女性员工的工资必须是在20万日元以下”,不得不说句这个规定真是太TM不合理了,在这个公司的人事表中,这条物理的规定是使用CHECK约束来描述的。
CONSTRAINT check_salary CHECK( CASE WHEN sex = '2' THEN CASE WHEN salary <= 200000 THEN 1 ELSE 0 END ELSE 1 END =1 )
不太明白约束最后面的 ELSE 1 END =1是个什么意思?
在这段代码里面CASE表达式被嵌入到CHECK约束里面,CASE中又嵌套了一个表达式,描述了如果是女性员工,则工资是20万日元以下这个命题,在这个命题逻辑中,该命题叫做蕴含式的逻辑表达式,记作P->Q。
蕴含式与逻辑与的区别:
逻辑 与的逻辑表达式是P^Q, 用逻辑与改写的CHECK约束如下:
CONSTRAINT check_salary CHECK(sex = '2' AND salary <= 200000)
如果在CHECK约束里面使用逻辑与,该工资将不能够雇佣男性员工,即sex =2必须为真,且salary <= 200000也必须为真。
而使用蕴含式中的CASE语句,则表示当sex =2时,如果salary<=200000则为真(1),如果sex=2,如果salary>200000则为假(0),
如果sex为其他情况,则均为真(1)。
如下为逻辑与和蕴含式的真值表,U代表unknown,T代表TRUE, F代表FALSE。
如上可以看到蕴含式是比逻辑与更为宽松的约束。
在UPDATE语句里面进行条件分支
思考下这样一种需求,以某数值行的列的当前值为判断条件,将其更新为别的值。
eg:下面是一张公司人事部的员工工资信息表Salaries,
假设现在需要根据以下条件对该表的数据进行更新:
1.对当前工资为30万日元以上的员工,降薪10%,
2.对当前工资为25万日元以上且不满28万日元的员工,加薪20%。
上述需求不能使用两个update进行操作,因为第一update操作之后的结果会影响第二个update操作。
使用如下语句可达到目的:
UPDATE salaries SET salary = CASE WHEN salary = 300000 THEN salary*0.9 WHEN salary >250000 AND salary <280000 THEN salary*1.2 ELSE salary END;
我最开始的操作是这样,结果导致所有的结果变成了0或1,
UPDATE salaries SET salary = CASE WHEN salary = 300000 THEN salary = salary*0.9 WHEN salary >250000 AND salary <280000 THEN salary = salary*1.2 ELSE salary = salary END;
这是因为THEN语句后面应该连接的是返回值,而不是赋值语句,我这样则将第一种和第二种情况的工资都变为了0,其他情况的工资则是0.
最后再强调一下,如果CASE表达式里面没有明确指定ELSE子句,执行结果会被默认地处理成ELSE NULL。放在此例里面,如果不加ELSE子句,则那些工资原本不应该变化的人的工资会变成NULL。
真是一个有用的技巧啊,可以用它简单地完成主键或者唯一键值调换这种繁重的工作。
通常我们想要调换主键值a和b时,需要将主键值临时转换成某个中间值,使用这种方式需要执行3次UPDATE操作,但是如果使用CASE表达式,1次即可做到。
例如,如果将此表中主键值a和b进行调换,只需要执行如下操作:
UPDATE SomeTable SET p_key = CASE WHEN p_key = 'a' THEN 'b' WHEN p_key = 'b' THEN 'a' ELSE p_key END;
WHERE P_KEY IN ('a','b');
【推荐】2025 HarmonyOS 鸿蒙创新赛正式启动,百万大奖等你挑战
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步