ORACLE添加基于同一表中其他记录的新列

嗨,所以我有一个称为产品的表,我那里有一些信息,例如名称,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;

但是第一个查询不起作用(可能是因为我在其中使用记录名称)有什么主意吗?

elegantseven 回答:ORACLE添加基于同一表中其他记录的新列

您可以将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

大家都在问