我想要实现的目标是Column 5
:
Column 1 Columns 2 Column 3 Column 4 Column 5
A B D A|B|D
我使用了派生列:
(DT_STR,50,1252)([A] + "|" + [B] + "|" + [C] + "|" + [D])
但我结束了:
Column 1 Columns 2 Column 3 Column 4 Column 5
A B D A|B||D
我很难找到合适的解决方案。
答案 0 :(得分:7)
您的问题是有一列空数据,并且您没有尝试在连接中测试或处理它。
如果您知道连续只有一个空列,则以下表达式将对其进行更正。它只是对结果字符串添加REPLACE
调用,以便将双管道组成一个管道。
(DT_STR,50,1252)REPLACE(([Column 1] + "|" + [Column 2] + "|" + [Column 3] + "|" + [Column 4]),"||","|")
否则,您将需要检查列是否具有值,然后才添加分隔符。这会产生如下表达式
(DT_STR,50,1252)(([Column 1] + ((LEN([Column 1]) == 0) ? "" : "|") + [Column 2] + ((LEN([Column 2]) == 0) ? "" : "|") + [Column 3] + ((LEN([Column 3]) == 0) ? "" : "|") + [Column 4]))
给出以下样本数据
SELECT
'A' AS [Column 1]
, 'B' AS [Column 2]
, '' AS [Column 3]
, 'D' AS [Column 4]
UNION ALL
SELECT
'A' AS [Column 1]
, '' AS [Column 2]
, '' AS [Column 3]
, 'D' AS [Column 4]
UNION ALL
SELECT
'A' AS [Column 1]
, '' AS [Column 2]
, '' AS [Column 3]
, '' AS [Column 4]
UNION ALL
SELECT
'' AS [Column 1]
, '' AS [Column 2]
, '' AS [Column 3]
, 'D' AS [Column 4];
生成以下结果
此时,我可能会跳过派生列并使用脚本组件生成连接数据。表达式的滚动是维护挑战。另外,上述脚本不会考虑NULL。
答案 1 :(得分:4)
这应该可以解决问题:
(DT_STR,50,1252)((Column1 == "" ? "" : Column1 + "|") + (Column2 == "" ? "" : Column2 + "|") + (Column3 == "" ? "" : Column3 + "|") + (Column4 == "" ? "" : Column4))
基本上,您需要检查每列中的空值,并连接空字符串或列内容,以及可选的分隔符,具体取决于列位置。