我刚刚开始学习一些SQL,并且我正在使用Oracle数据库11g。我的问题是我有一个职员表,我试图根据职员的职位更新每个职员的佣金。我想将正式员工的佣金更新为0.04(4%),将经理的佣金更新为0.05(5%)。
有一种方法可以在一个语句中完成所有这些操作吗?
我这样做的方式是,我只是通过以下方式更新了所有员工佣金:
UPDATE staff SET commission = 0.04;
然后我做了另一个更新语句来仅更新管理器
UPDATE staff SET commission = 0.05 WHERE position = 'Manager';
我在想一些与此类似的东西,但是这不会起作用。
UPDATE staff SET commission = 0.04 WHERE NOT position = 'Manager' AND SET commission = 0.05
WHERE position = 'Manager';
感谢您的帮助!非常感谢!
答案 0 :(得分:2)
您可以在此处使用CASE
表达式:
UPDATE staff
SET commission = CASE WHEN position = 'Manager'
THEN 0.05
ELSE 0.04 END;
这假设您确实想对每位非经理人进行总括分配,佣金为0.04。
答案 1 :(得分:1)
更灵活的方法是拥有一个包含位置相关数据的位置表。
CREATE TABLE position
(
PositionID NUMBER(10) NOT NULL,
Position NVARCHAR2(50) NOT NULL,
Commission NUMBER(8, 4) NOT NULL
);
然后,每位工作人员都会通过一列引用职位
PositionID NUMBER(10) NOT NULL
那么您只需要更新头寸表中的佣金
UPDATE position SET Commission = 0.05 WHERE Position = 'Manager';
这使您可以轻松区分两个以上的位置。
答案 2 :(得分:1)
在Oracle中,解码是一种便捷的方法:
method q(i: seq<int>) returns (o: seq<int>)
ensures o == s(i)
{
var n := 0;
o := [];
while n < |i|
invariant n <= |i| && o + s(i[n..]) == s(i)
{
if i[n] == 42 {
o := o + [i[n]];
}
n := n + 1;
}
}