ORACLE 添加基于来自相同 table 的其他记录的新列

ORACLE add new column which base on other records from same table

你好,我有 table 称为产品,我有一些信息,如名称、netto 价格、税等。我想添加名为 brutto_price 的新记录,它自动计算为 (netto_price + netto_price*tax) or (netto_price *1.22 if tax is null) 不允许将 null 插入 netto_price。 (税可以为空)。 我正在这样做

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;

但是第一个查询不起作用(可能是因为我在其中使用了记录名称)知道吗?

您可以使用 CASE 作为 "if tax is null" 位:

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 或税费发生变化)。请看一下 "virtual columns":

ALTER TABLE products ADD (
  brutto_price NUMBER GENERATED ALWAYS AS (
    netto_price * (1 + NVL(tax, 0.22)))
);

现在您可以 select 从您的 table 中得到正确的 brutto_price 计算结果:

SELECT * FROM products;

NETTO_PRICE  TAX   BRUTTO_PRICE
   10        5,2           15,2
   20        NULL          24,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