4

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

我正在使用 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)

如您所见,我将不得不手动进入并通过添加另一个带有新货币代码的 OR 语句来更改公式。

是否有可能按照以下方式做一些事情:

(case when t2.flagCurrencyCalc=True对于在 t1 中找到的记录中的给定货币代码then (formula1) else (formula2) end)

???

4

2 回答 2

4

您不能直接访问计算列中的另一个表(参见此处)。

这里有一些选项。

您可以使用以下方法简化您的公式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;

您可以定义一个函数来检查货币。

于 2013-06-21T17:31:17.420 回答
-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
于 2013-06-21T17:33:22.713 回答