2010-04-22 74 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的语句,另一列中的值为高值?