SSIS:派生列表达式中的 IF else
SSIS: IF else in Derived Column expressions
我正在尝试转换时间在平面文件源中的写入方式,因此它实际上看起来像时间。(如果这有意义的话)。
现在我把它写成 1215
、630
、10
、1
等。所以它可以是 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
方法中使用以下代码:
假设TIMEOCC
和outColumn
是你的输入和输出列
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"))))
参考资料
https://www.sqlservercentral.com/Forums/Topic1456697-148-1.aspx
How to write SSIS switch/case expression?
所有这些答案都太复杂了。太复杂了。对我来说,这远没有那么复杂:
LEFT(RIGHT(("0000" + [TIME OCC]),4),2) +
":" +
RIGHT(RIGHT(("0000" + [TIME OCC]),4),2)
我正在尝试转换时间在平面文件源中的写入方式,因此它实际上看起来像时间。(如果这有意义的话)。
现在我把它写成 1215
、630
、10
、1
等。所以它可以是 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
方法中使用以下代码:
假设TIMEOCC
和outColumn
是你的输入和输出列
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"))))
参考资料
https://www.sqlservercentral.com/Forums/Topic1456697-148-1.aspx
How to write SSIS switch/case expression?
所有这些答案都太复杂了。太复杂了。对我来说,这远没有那么复杂:
LEFT(RIGHT(("0000" + [TIME OCC]),4),2) +
":" +
RIGHT(RIGHT(("0000" + [TIME OCC]),4),2)