视图中的条件 Select - MYSQL
Conditional Select in View - MYSQL
我有一个视图需要显示项目的转换价格。
我有 2 tables 加入 Item_Price & FX_Rate
简化示例:
项目table 百万数据
IP.ITEM
Item_Price.PRICE
Item_Price.CURRENCY
Apple
1
USD
Orange
77
INR
Avocado
22
MXN
Pear
0.9
USD_OLD
外汇汇率 table 持续更新实时汇率
FX_Rate.CURRENCY
FX_Rate.FX
USD
1
INR
0.013
MXN
0.049
USD_OLD
1.79
两个 table 结构都无法修改,因此我创建了一个视图来显示商品的标准化价格:
CREATE VIEW USD_ITEMS AS
SELECT
IP.NAME AS NAME,
(Item_Price.PRICE * FX_Rate.FX) AS USD_price
...
FROM
Item_Price IP
JOIN FX_Rate FX ON(
IP.CURRENCY = FX.CURRENCY
)
虽然一切都将随之而来,
USD_OLD 现已过时,所有以 USD_OLD 为货币的项目都需要使用美元的汇率换算
我尝试使用 IF / CASE WHEN 但我无法找到一种方法来故意切换 FX,其中 CURRENCY='USD_OLD'
伪代码错误? :
CASE USD_price
WHEN FX_Rate.CURRENCY='USD_OLD'
THEN (Item_Price.PRICE * FX_Rate.FX WHERE FX_Rate.CURRENCY='USD_OLD')
ELSE (Item_Price.PRICE * FX_Rate.FX)
我知道以上是不可能的,因为视图是 JOIN ON Item_Price.CURRENCY = FX_Rate.CURRENCY
视图中的临时 table 会有帮助吗?
我无法解决这个问题,真的需要一些专家的帮助,谢谢。
像这样改变你的看法:
CREATE VIEW USD_ITEMS AS
SELECT
IP.NAME AS NAME,
(Item_Price.PRICE * FX_Rate.FX) AS USD_price
...
FROM
Item_Price IP
JOIN FX_Rate FX ON(
IF(IP.CURRENCY = 'USD_OLD' , 'USD', IP.CURRENCY) = FX.CURRENCY
)
您需要始终加入 USD
行,然后仅在必要时使用它。例如:
create view usd_items as
select
ip.name,
ip.price * case when ip.currency <> 'USD_OLD' then fx.fx else u.fx end
as usd_price
from item_price ip
join fx_rate fx on ip.currency = fx.currency
cross join (
select * from fx_rate where currency = 'USD'
) u
我有一个视图需要显示项目的转换价格。 我有 2 tables 加入 Item_Price & FX_Rate
简化示例:
项目table 百万数据
IP.ITEM | Item_Price.PRICE | Item_Price.CURRENCY |
---|---|---|
Apple | 1 | USD |
Orange | 77 | INR |
Avocado | 22 | MXN |
Pear | 0.9 | USD_OLD |
外汇汇率 table 持续更新实时汇率
FX_Rate.CURRENCY | FX_Rate.FX |
---|---|
USD | 1 |
INR | 0.013 |
MXN | 0.049 |
USD_OLD | 1.79 |
两个 table 结构都无法修改,因此我创建了一个视图来显示商品的标准化价格:
CREATE VIEW USD_ITEMS AS
SELECT
IP.NAME AS NAME,
(Item_Price.PRICE * FX_Rate.FX) AS USD_price
...
FROM
Item_Price IP
JOIN FX_Rate FX ON(
IP.CURRENCY = FX.CURRENCY
)
虽然一切都将随之而来, USD_OLD 现已过时,所有以 USD_OLD 为货币的项目都需要使用美元的汇率换算
我尝试使用 IF / CASE WHEN 但我无法找到一种方法来故意切换 FX,其中 CURRENCY='USD_OLD'
伪代码错误? :
CASE USD_price
WHEN FX_Rate.CURRENCY='USD_OLD'
THEN (Item_Price.PRICE * FX_Rate.FX WHERE FX_Rate.CURRENCY='USD_OLD')
ELSE (Item_Price.PRICE * FX_Rate.FX)
我知道以上是不可能的,因为视图是 JOIN ON Item_Price.CURRENCY = FX_Rate.CURRENCY
视图中的临时 table 会有帮助吗?
我无法解决这个问题,真的需要一些专家的帮助,谢谢。
像这样改变你的看法:
CREATE VIEW USD_ITEMS AS
SELECT
IP.NAME AS NAME,
(Item_Price.PRICE * FX_Rate.FX) AS USD_price
...
FROM
Item_Price IP
JOIN FX_Rate FX ON(
IF(IP.CURRENCY = 'USD_OLD' , 'USD', IP.CURRENCY) = FX.CURRENCY
)
您需要始终加入 USD
行,然后仅在必要时使用它。例如:
create view usd_items as
select
ip.name,
ip.price * case when ip.currency <> 'USD_OLD' then fx.fx else u.fx end
as usd_price
from item_price ip
join fx_rate fx on ip.currency = fx.currency
cross join (
select * from fx_rate where currency = 'USD'
) u