选择的UPDATE--主键互换

数据库:twt001

数据表:aupkey

参考文章:SQL中的CASE WHEN用法

例,有如下更新条件     
    
工资以上的职员,工资减少%      
    
工资在到之间的职员,工资增加%      
    
很容易考虑的是选择执行两次UPDATE语句,如下所示     
    
--条件     
    
UPDATE Personnel     
    
SET salary = salary * 0.9     
    
WHERE salary >= 5000;     
    
--条件     
    
UPDATE Personnel     
    
SET salary = salary * 1.15     
    
WHERE salary >= 2000 AND salary < 4600;     
    
但是事情没有想象得那么简单,假设有个人工资块。首先,按照条件,工资减少%,变成工资。接下来运行第二个SQL时候,因为这个人的工资是在到的范围之内,需增加%,最后这个人的工资结果是,不但没有减少,反而增加了。如果要是反过来执行,那么工资的人相反会变成减少工资。暂且不管这个规章是多么荒诞,如果想要一个SQL 语句实现这个功能的话,我们需要用到Case函数。代码如下:      
    
UPDATE Personnel     
    
SET salary = CASE WHEN salary >= 5000     
    
            THEN salary * 0.9     
    
WHEN salary >= 2000 AND salary < 4600     
    
THEN salary * 1.15     
    
ELSE salary END;     
    
这里要注意一点,最后一行的ELSE salary是必需的,要是没有这行,不符合这两个条件的人的工资将会被写成NUll,那可就大事不妙了。在Case函数中Else部分的默认值是NULL,这点是需要注意的地方。     
    
这种方法还可以在很多地方使用,比如说变更主键这种累活。     
    
一般情况下,要想把两条数据的Primary key,a和b交换,需要经过临时存储,拷贝,读回数据的三个过程,要是使用Case函数的话,一切都变得简单多了。 
 
    表内容及字段设置如下:
         
 
假设有如上数据,需要把主键a和b相互交换。用Case函数来实现的话,代码如下 :
 
UPDATE aupkey
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');   
 
查看表内容: 发现主键a,b已经交换
 
再运行一次程序,表将还原为原来的状态
 

 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值