SQL计算列,包含case语句和表连接

时间:2013-06-21 17:11:29

标签: sql sql-server-2008 case

好的,我已经完成了一些网络挖掘工作,似乎无法找到如何使这种情况发挥作用,或者即使有可能。

我正在使用SQL Server 2008并且有一个计算列,我试图计算一些有关外币汇率的值。

虽然从长远来看,单个表可能更容易,但我想使用涉及两个不同表的正确解决方案。

t1包含一个事务日志。表t2包含给定货币的基本信息。可以使用currencyCode属性连接这两个表。

粘性部分附带货币相关计算。目前,CR1 CR2 CR3CR4的计算方式不同,但在将来随着更多货币的增加,新货币可能存在差异。理想情况下,新行将添加到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)

???

2 个答案:

答案 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