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
。
你好,我有 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
。