我需要以某种方式使用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));
答案 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语句,而在另一列中执行增加的值吗?