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