好的,我已经完成了一些网络挖掘工作,似乎无法找到如何使这种情况发挥作用,或者即使有可能。
我正在使用SQL Server 2008并且有一个计算列,我试图计算一些有关外币汇率的值。
虽然从长远来看,单个表可能更容易,但我想使用涉及两个不同表的正确解决方案。
表t1
包含一个事务日志。表t2
包含给定货币的基本信息。可以使用currencyCode
属性连接这两个表。
粘性部分附带货币相关计算。目前,CR1
CR2
CR3
或CR4
的计算方式不同,但在将来随着更多货币的增加,新货币可能存在差异。理想情况下,新行将添加到t2
和一个位标志(flagCurrencyCalc
)设置,指定使用或不使用备用计算。
所以现在的公式看起来像这样:
(case when [currencyCode]='CR1' OR [currencyCode]='CR2' OR [currencyCode]='CR3' OR [currencyCode]='CR4' then (formula1) else (formula2) end)
正如您所看到的,我必须手动进入并通过添加另一个带有新currencyCode的OR语句来改变形式。
是否可以按照以下方式做点什么:
对于在t1(case when t2.flagCurrencyCalc=True
中找到的记录中的给定货币代码, then (formula1) else (formula2) end)
???
答案 0 :(得分:3)
您无法直接访问计算列中的另一个表(请参阅here)。
以下是一些选项。
您可以使用in
简化公式:
(case when currencyCode in ('CR1', 'CR2', 'CR3', 'CR4')
then (formula1)
else (formula2)
end)
您可以使用视图:
create view vw_tablename as
select t.*,
(case when currencyCode in (select currencyCode from ListOfCurrencies where . . . )
then (formula1)
else (formula2)
end)
from t;
您可以定义一个功能来检查货币。
答案 1 :(得分:-1)
是的,这是可能的。如果你提议的另一张表是
CurrencyFlag (curr_code varchar(5), flag bit)
curr_code flag
--------- -----
C1 1
C2 0
...
然后你的案子可以有一个子查询
SELECT t1.col1, t1.col2,
CASE
WHEN (SELECT flag FROM CurrencyFlag t2 WHERE t2.curr_code = t1.currencyCode) = 1
THEN formula1
ELSE formula2
END , t1.col3
FROM
table1 t1