我在表格中有薪水和税收列。我需要自动将条件值放在tax
列中,由sal
列计算。因此,如果我更改薪水中的值,税务会自动更改。例如:
如果超过3000的工资使tax = salary*25/100
等
我该怎么办?
如何在表格中间添加列?
EMPNO
ENAME
JOB
MGR
HIREDATE
SAL
COMM
DEPTNO
TAX <-- don't want here
答案 0 :(得分:1)
“我需要按税率栏中的条件自动输入值将按工资栏计算,因此如果我更改了工资中的值,则税金会自动更改。”
从11g开始,最简单的方法是使用虚拟列:
alter table emp add tax number generated always as (sal * 0.25);
每当填充tax
时,这将自动保持sal
的值。
“需要超过条件......例如(超过4000有25%,超过3000有20%等”
因此,这种方法的问题在于它不会轻易地允许您按工资范围更改不同员工的税率。我们可以这样做,比如CASE声明......
alter table emp add tax number generated always as
(case when sal < 3000 then 0 when sal < 4000 then sal * 0.2 else sal * 0.25 end );
......但这很麻烦。
在物理数据模型中嵌入这些业务规则也是不好的做法。例如,他们在我们的数据库工具中缺乏可见性,因此在诊断错误或进行影响评估时很容易忽略它们。
但更大的问题是业务规则会发生变化。因此,如果税率发生变化,我们必须通过修改列来应用这些更改,以便新的费率会在时间上倒退,这会让每个人都感到担心。对于税收这样的事情,最好按需编程计算,这样可以更准确地控制计算。
这意味着一个触发器。
alter table emp add tax number;
create or replace trigger emp_tax_calc
before insert or update on emp
for each row
begin
case
when :new.sal < 3000 then :new.tax := 0;
when :new.sal < 4000 then :new.tax := :new.sal * 0.20;
else :new.tax := :new.sal * 0.25;
end case;
end;
/
这是a LiveSQL demo (free Oracle Technet account required)。
“如何在表格中间添加列”
这是你无法做到的。添加到现有表的列将附加到投影的末尾。如果你考虑将一个新列压缩到表格中间所需的混洗表所需的工作量,这就非常有意义。
但是表格列的顺序并不重要。所有重要的是它们在SELECT投影中出现的顺序。 (几乎)总是更好地明确列出列而不是依赖select *
,因此您可以按照您想要的任何顺序排列投影列。
答案 1 :(得分:0)
作为@APC stated,最简单的方法是虚拟列:
Oracle 11g R2架构设置:
CREATE TABLE emp( sal NUMBER );
ALTER TABLE emp ADD tax NUMBER
GENERATED ALWAYS AS (
GREATEST( 0, sal - 0 ) * 0.00 -- 0% tax on salary >= 0
+ GREATEST( 0, sal - 3000 ) * 0.20 -- + additional 20% tax on salary >= 3000
+ GREATEST( 0, sal - 4000 ) * 0.05 -- + additional 5% tax on salary >= 4000
);
INSERT INTO emp (sal) VALUES ( 0 );
INSERT INTO emp (sal) VALUES ( 3000 );
INSERT INTO emp (sal) VALUES ( 3500 );
INSERT INTO emp (sal) VALUES ( 4000 );
INSERT INTO emp (sal) VALUES ( 5000 );
查询1 :
SELECT * FROM emp
<强> Results 强>:
| SAL | TAX |
|------|-----|
| 0 | 0 |
| 3000 | 0 |
| 3500 | 100 |
| 4000 | 200 |
| 5000 | 450 |