SSIS:派生列表达式中的 IF else

SSIS: IF else in Derived Column expressions

我正在尝试转换时间在平面文件源中的写入方式,因此它实际上看起来像时间。(如果这有意义的话)。

现在我把它写成 1215630101 等。所以它可以是 4-1 个字符长,所以我需要根据列的长度进行转换。

我在 Derived Column 中使用表达式执行此操作,但我似乎无法使其工作,不确定是我的语法错误还是什么,表达式看起来像这样,但我收到错误:

(LEN([TIME OCC]) == 4) ? (SUBSTRING([TIME OCC],1,2) + ":" +  SUBSTRING([TIME OCC],3,2)) : (LEN([TIME OCC]) == 3) ? (SUBSTRING([TIME OCC],1,1) + ":" + SUBSTRING([TIME OCC],2,2)) : (LEN([TIME OCC]) == 2) ? (SUBSTRING([TIME OCC],1,2) + ":00") : (LEN([TIME OCC]) == 1) ? (SUBSTRING([TIME OCC],1,1) + ":00")

当我只使用如下两个值时,它似乎工作得很好:

LEN([TIME OCC]) == 3 ? SUBSTRING([TIME OCC],1,1) + ":" + SUBSTRING([TIME OCC],2,2) : SUBSTRING([TIME OCC],1,2) + ":" + SUBSTRING([TIME OCC],3,2)

非常感谢任何帮助,谢谢!

您正在以不完整的三元表达式结束表达式。我添加了一些换行符和缩进以使其更具可读性:

(LEN([TIME OCC]) == 4) ? 
(SUBSTRING([TIME OCC],1,2) + ":" +  SUBSTRING([TIME OCC],3,2)) : 
  (LEN([TIME OCC]) == 3) ? 
  (SUBSTRING([TIME OCC],1,1) + ":" + SUBSTRING([TIME OCC],2,2)) : 
    (LEN([TIME OCC]) == 2) ? 
    (SUBSTRING([TIME OCC],1,2) + ":00") : 
      (LEN([TIME OCC]) == 1) ? 
      (SUBSTRING([TIME OCC],1,1) + ":00")  <-- there needs to be a : with an ELSE condition here

我不知道是否有必要,但我还会在每个嵌套的三元表达式周围加上一组括号。

正如 Tab 所说,缺少最后一个选择,试试这个:

LEN([TIME OCC]) == 4 ? (DT_WSTR,2)SUBSTRING([TIME OCC],1,2) + ":" + (DT_WSTR,2)SUBSTRING([TIME OCC],3,2) 
: LEN([TIME OCC]) == 3 ?(DT_WSTR,1)SUBSTRING([TIME OCC],1,1) + ":" + (DT_WSTR,2)SUBSTRING([TIME OCC],2,2) 
: LEN([TIME OCC]) == 2 ? (DT_WSTR,2)SUBSTRING([TIME OCC],1,2) + ":00"  
: (DT_WSTR,1)SUBSTRING([TIME OCC],1,1) + ":00"

假设最后一个选择的长度为 1。
希望对您有所帮助。

我认为 Derrived 专栏不是解决您问题的最佳方法(它可能更复杂)。您可以添加一个脚本组件并将您的列标记为输入,创建一个新的输出列(Type DT_STR)并在 OutpoutBuffer0_ProcessInputRow 方法中使用以下代码:

假设TIMEOCCoutColumn是你的输入和输出列

If Not row.TIMEOCC_IsNull AndAslo _
   Not String.IsnullorEmpty(Row.TIMEOCC.trim) Then

   Select Case Row.TIMEOCC.Trim.Length

   Case 1

         Row.OutColumn = Row.TIMEOCC & ":00"
   Case 2

         Row.OutColumn = Row.TIMEOCC & ":00"
   Case 3

         Row.OutColumn = Row.TIMEOCC.Substring(0,1) & ":" & Row.TIMEOCC.Substring(1,2)
   Case 4

         Row.OutColumn = Row.TIMEOCC.Substring(0,2) & ":" & Row.TIMEOCC.Substring(2,2)
   Case Else

          Row.OutColumn = "00:00"
   End Select

Else

    Row.OutColumn = "00:00"

End If

如果您只想通过派生列来解决问题

我想这就是你要找的:

     ISNULL([TIME OCC]) ? "00:00" 
: (LEN([TIME OCC]) == 4 ? ((DT_WSTR,2)SUBSTRING([TIME OCC],1,2) + ":" + (DT_WSTR,2)SUBSTRING([TIME OCC],3,2)) 
: (LEN([TIME OCC]) == 3 ?((DT_WSTR,2)SUBSTRING([TIME OCC],1,1) + ":" + (DT_WSTR,2)SUBSTRING([TIME OCC],2,2))
: (LEN([TIME OCC]) == 2 ? ((DT_WSTR,2)SUBSTRING([TIME OCC],1,2) + ":00")  
: (LEN([TIME OCC]) == 1 ? ((DT_WSTR,2)SUBSTRING([TIME OCC],1,1) + ":00")
: "00:00"))))

参考资料

所有这些答案都太复杂了。太复杂了。对我来说,这远没有那么复杂:

LEFT(RIGHT(("0000" + [TIME OCC]),4),2) + 
":" +
RIGHT(RIGHT(("0000" + [TIME OCC]),4),2)