2010-04-22 80 views
6

我需要以某種方式使用CASE語法(這超出了我)根據條件來影響數據庫結果。 我有一堆版稅0.#表格(版稅) 我有一個標題ID#(title_id),我需要顯示新的版稅增加,以便我可以使用這些數據。DB2 CASE聲明

IF: they have a current royalty of 0.0 - 0.1 = 10% raise 
IF: they have 0.11 - 0.15 = 20% raise 
IF: royalty >= 0.16 = 20% raise 

任何幫助將不勝感激。

create table royalites (
title_id char(6), 
lorange  integer, 
hirange  integer, 
royalty  decimal(5,2)); 
+0

這兩個最後的「IF:」可以摺疊成單一的條件,因爲它們是不透明的......只是一個註釋 – AtliB 2011-11-03 13:34:05

回答

9

其實,你需要使用case聲明:

update royalties set royalty = royalty * 1.2 
    where royalty >= 0.16; 
update royalties set royalty = royalty * 1.2 
    where royalty >= 0.11 and royalty < 0.16; 
update royalties set royalty = royalty * 1.1 
    where royalty < 0.11; 

(事務控制之下,如果你需要原子)。如果你的問題狀態與你的問題狀態有相同的倍數,你可以將前兩個結合起來。

它的工作原理是確保先執行更高的值並限制where子句中哪些行受到影響。

如果你覺得你必須使用一個case聲明:

update royalties set royalty = 
    case when royalty >= 0.16 then royalty * 1.2 
    case when royalty >= 0.11 and royalty < 0.16 then royalty * 1.2 
    case when royalty < 0.11 then royalty * 1.1 
    end; 

只需更改你拉什麼表了(而不是改變表本身),並將其與當前的比較:

select title_id, lorange, hirange, royalty, 
    case when royalty >= 0.16 then royalty * 1.2 
    case when royalty >= 0.11 and royalty < 0.16 then royalty * 1.2 
    case when royalty < 0.11 then royalty * 1.1 
    end as new_royalty 
    from royalties; 
+0

是的,但我想在不改變數據的情況下展示這個,所以我可以顯示兩個數字。 – 2010-04-22 13:27:08

+0

道歉,@gamerzfuse,我以爲你想修改實際的表。查看我的更新,瞭解如何更改表格中的數據。 – paxdiablo 2010-04-22 13:37:19

+0

謝謝,第二部分工作的魅力! – 2010-04-22 13:39:19

0

我不知道確切的DB2語法,也不無論是從Oracle或SQL Server不同,但我估計像下面這樣:

update royalties as r 
set r.royalty = r.royalty * (
    select case 
       when r.royalty between 0.0 and 0.1 then 1.1 
       when r.royalty > 0.11 then 1.2 
      and 
     from royalties 
) 

如果我正確地理解了這個問題,那麼這段代碼就可以完成這項工作。每當更新啓動時,這將應用每行的加值。如果您希望爲每行執行條件更新,則可以添加where子句。

編輯

是的,但是我想表明這一點沒有改變數據,這樣我就可以顯示兩個數字

你的意思,你只想要執行的比較一列中的初始值爲select的語句,另一列中的值爲高值?