DB2 CASE语句

时间:2010-04-22 13:14:07

标签: sql db2 case

我需要以某种方式使用CASE语法(超出我的范围)来根据条件影响数据库结果。     我在0中有一堆版税。#form(royalty)     我有一个标题ID#(title_id),我需要显示新的版税增加,以便我可以使用这些数据。

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));

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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语句,而在另一列中执行增加的值吗?