SSIS中用派生列实现SQL CASE语句报错的技术问询
SSIS派生列实现CASE语句的修正方案
原SQL逻辑回顾
原SQL的两个CASE逻辑:
- result_fixed:当
VALUE首字符不是<且不为空时,转换为decimal类型;否则返回NULL - results_ltd:当
VALUE首字符是<或为空时,返回1;否则返回0
修正后的派生列表达式
1. 实现result_fixed的表达式
-- 注意:DT_DECIMAL需指定精度(示例为2位小数,可按需调整) ISNULL([RESULTS]) || FINDSTRING([RESULTS], "<", 1) == 1 ? NULL(DT_DECIMAL, 2) : (DT_DECIMAL, 2)[RESULTS]
2. 实现results_ltd的表达式
ISNULL([RESULTS]) || FINDSTRING([RESULTS], "<", 1) == 1 ? 1 : 0
原表达式的错误分析
- 语法不完整:SSIS条件运算符是
? :三元结构,原第一个表达式仅写了?未提供:分支,导致解析失败 - 多余括号:
FINDSTRING( [RESULTS] ,"<", 1))多了一个闭合括号,需删除最后一个) - 强制转换语法错误:SSIS中decimal转换格式为
(DT_DECIMAL, 精度),原写法(DT_DECIMAL, [RESULTS])不符合规则,正确格式是(DT_DECIMAL, 2)[RESULTS] - 未覆盖NULL场景:原SQL中
VALUE为NULL时,result_fixed返回NULL、results_ltd返回1,原表达式未处理该情况
逻辑匹配验证
对照示例数据:
- 当
RESULTS为9.52:FINDSTRING返回0,result_fixed转换为decimal,results_ltd返回0 - 当
RESULTS为NULL:ISNULL返回True,result_fixed为NULL,results_ltd返回1 - 当
RESULTS为< LOD:FINDSTRING返回1,result_fixed为NULL,results_ltd返回1
完全匹配原SQL的业务逻辑。
内容的提问来源于stack exchange,提问作者John Nada
相关产品推荐
相关产品推荐

