将SQL中的CASE表达式转换为SSIS中的派生列

时间:2012-03-07 16:38:28

标签: sql sql-server-2008 ssis

CASE 
        WHEN CHARINDEX('%', '{FixedARMRateReductionLimit}') > 0 THEN
            CAST(SUBSTRING('{FixedARMRateReductionLimit}', 0, 
               CHARINDEX('%', '{FixedARMRateReductionLimit}')) as decimal)/100
        WHEN '{FixedARMRateReductionLimit}' = 'Weekly PMMS Rate' THEN
            PARAM_VAL_TXT
        ELSE
            .02
    END

2 个答案:

答案 0 :(得分:6)

以下故事的寓意是,仅仅因为你可以在SSIS中做某事,这并不总是一个好主意。

例如,这个查询。使用现有的sql逻辑来生成最终值比使用SSIS中的派生列或脚本任务(更不用说管道内存,CPU等的浪费)更有效率

来源查询

我使用以下内容作为源查询。

SELECT '50%' AS FixedARMRateReductionLimit, .1 AS PARAM_VAL_TXT
UNION ALL  SELECT 'Weekly PMMS Rate' AS FixedARMRateReductionLimit, .3 AS PARAM_VAL_TXT
UNION ALL  SELECT 'Frack',  .5

查找百分比位置

确定列中是否存在百分比符号。这会创建一个名为PercentPosition

的列
FINDSTRING(FixedARMRateReductionLimit, "%",1)

检查费率文本

如第一个表达式所示,进行简单的比较就足够了,但我遇到了问题。我认为这是一个string conversion/comparison问题(见第一个注释)。我使用findstring来生成序数位置,而不是使用布尔值。

FixedARMRateReductionLimit == "'Weekly PMMS Rate"
FINDSTRING(FixedARMRateReductionLimit,"Weekly PMMS Rate",1)

导出输出

享受Ternary operator的双重用途。

(RateTextPosition > 0) ? (PARAM_VAL_TXT) : (PercentPosition == 0) ? .2 : ((DT_NUMERIC, 18,2) SUBSTRING(FixedARMRateReductionLimit,1,PercentPosition - 1))/100

你可以在脚本任务中简化一些,但我只是在源代码中执行逻辑。

答案 1 :(得分:1)

这只是为了说明如何在派生变换中构造表达式。我不建议这样做,因为它很难维护。

请参阅此问题@billinkc

Convert CASE expression in SQL to derived column in SSIS回答

以下是如何在Derived transformation中编写表达式。

(FINDSTRING(FixedARMRateReductionLimit,"%",1) > 1) ? ((DT_NUMERIC,5,2)SUBSTRING(FixedARMRateReductionLimit,1,FINDSTRING(FixedARMRateReductionLimit,"%",1) - 1)) : (FixedARMRateReductionLimit == "Weekly PMMS Rate" ? (0.35) : (0.02))

表达式的格式化版本。

(FINDSTRING(FixedARMRateReductionLimit,"%",1) > 1) 
    ?   (
            (DT_NUMERIC,5,2) 
                SUBSTRING(  FixedARMRateReductionLimit, 
                            1, 
                            FINDSTRING(FixedARMRateReductionLimit, "%", 1) - 1
                          )
        ) 
    :   FixedARMRateReductionLimit == "Weekly PMMS Rate" 
            ? (0.35) 
            : (0.02))

使用的样本数据:

SELECT c1 AS FixedARMRateReductionLimit
FROM
(
            SELECT '2.00%'              AS c1 
    UNION   SELECT '13.95%'             AS c1 
    UNION   SELECT '%52.00%'            AS c1 
    UNION   SELECT '%%'                 AS c1 
    UNION   SELECT '85.%42%'            AS c1 
    UNION   SELECT 'Weekly PMMS Rate'   AS c1 
    UNION   SELECT 'Monthly PMMS Rate' 
) T1

在数据查看器中查看时派生转换的输出:

Output