您可以将CASE
用作“如果税为空”位:
CREATE TABLE products (
netto_price NUMBER,tax NUMBER
);
INSERT INTO products (netto_price,tax) VALUES (10,5.2);
INSERT INTO products (netto_price,tax) VALUES (20,NULL);
SELECT netto_price,tax,CASE WHEN tax IS NULL THEN netto_price * 1.22
ELSE netto_price + netto_price * tax
END as brutto_price
FROM products;
NETTO_PRICE TAX BRUTTO_PRICE
10 5,2 15,2
20 NULL 24,4
或者,有一个名为NVL
的函数可以在参数为NULL的情况下提供默认值:
SELECT netto_price,netto_price * (1 + NVL(tax,0.22)) AS brutto_price
FROM products;
也许您不需要将brutto价格添加为真实列(因为这样一来,如果netto_price或税项发生变化,您有责任将其保持最新)。请查看“虚拟列”:
ALTER TABLE products ADD (
brutto_price NUMBER GENERATED ALWAYS AS (
netto_price * (1 + NVL(tax,0.22)))
);
现在您可以从表中进行选择,并始终获得正确的brutto_price计算值:
SELECT * FROM products;
NETTO_PRICE TAX BRUTTO_PRICE
10 5,4
即使您更改税金,brutto_price也会自动更改。
,
我认为您想要的逻辑是:
alter table products add brutto_price FLOAT;
update products
set brutto_price = netto_price + netto_price * coalesce(tax,0.22);
但是,Oracle可以通过使用virtual columns来简化此逻辑:
alter table products add brutto_price float as (netto_price + netto_price * coalesce(tax,0.22));
不需要更新。该值始终是最新的。
注意:float
对于货币价值而言确实是一个糟糕的选择。您应该使用定点表示形式-number
/ numeric
/ decimal
。
本文链接:https://www.f2er.com/2335845.html