嗨,所以我有一个称为产品的表,我那里有一些信息,例如名称,netto价格,税等。我想添加名为brutto_price的新记录,该记录自动计算为(netto_price + netto_price * tax)或(netto_price * 1.22如果tax为null),则不允许在netto_price中插入null。 (税项可以为空)。 我正在做这样的事情
alter table products add (brutto_price FLOAT DEFAULT netto_price*1.22 )
UPDATE products
SET brutto_price = netto_price + netto_price*tax
where
tax is not null;
但是第一个查询不起作用(可能是因为我在其中使用记录名称)有什么主意吗?
答案 0 :(得分:1)
您可以将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, tax,
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,2 15,2
20 NULL 24,4
即使您更改税金,brutto_price也会自动更改。
答案 1 :(得分:1)
我认为您想要的逻辑是:
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
。