最近使用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
