oracle使用case或decode语句实现批量更新


最近使用oracle数据库做开发,一开始只需要批量更新多条记录中的某一个字段,后来需求变更需要对多个字段进行更新,故查看资料得到如下内容,分享给大家。我在oracle 10g环境下,都能跑通。

批量更新一个字段:

1 UPDATE categories 
2     SET display_order = CASE id 
3         WHEN '1' THEN 3 
4         WHEN '2' THEN 4 
5         WHEN '3' THEN 5 
6     END
7 WHERE id IN ('1','2','3');

或者更普遍的方式:

UPDATE test
    SET first_name = CASE 
        WHEN card_no = 100 THEN 'aaa'
        WHEN card_no = 110 THEN 'bbb'
        ELSE first_name
END

如果要批量更新多条记录的多个字段,则

UPDATE categories 
    SET display_order = CASE id 
        WHEN '1' THEN 3 
        WHEN '2' THEN 4 
        WHEN '3' THEN 5 
    END, 
    title = CASE id 
        WHEN '1' THEN 'New Title 1'
        WHEN '2' THEN 'New Title 2'
        WHEN '3' THEN 'New Title 3'
    END
WHERE id IN ('1','2','3')

UPDATE test
    SET first_name = CASE 
        WHEN card_no = 100 THEN 'aaa'
        WHEN card_no = 110 THEN 'bbb'
        ELSE first_name
    END,
    last_name = CASE 
        WHEN card_no = 100 THEN 'xxx'
        WHEN card_no = 110 THEN 'yyy'
        ELSE last_name
    END    

每个部分都罗列了两种方法,第二种方法更普遍,case后面直接是when,when里面可以包含更复杂的添加,比如大于小于等;但是第一种方法虽然case后直接指明了条件字段id,但因为有where的限制,执行起来更块一些把,其实针对第二种方法也可以加where以限制的。

 

另外,还看到一种使用decode的批量更新方法,不过好像decode的效率要低一些。

UPDATE test
SET first_name = DECODE(card_no,100,'aaa',110,'bbb')
   ,last_name = DECODE(card_no,100,'xxx',110,'yyy')
WHERE card_no IN (100,101)

参考地址:

http://www.jb51.net/article/41852.htm

https://community.oracle.com/thread/682763


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM