使用正确函数时的 SSIS 子串错误使用案例
SSIS Substring Error Using Case When with Right Function
我在我的 SSIS 派生列中使用以下代码删除姓名列中的标题,例如先生、女士、女士和博士
例如:-
Mr ABC
MS XYZX
Mrs qwrer
DR ADCS
所以我要删除名字的标题。
SUBSTRING( [Name] , 1, 3)=="Mr" && LEN( [Name] ) >2 ? RIGHT([Name],LEN([Name])-2)
但是由于不完整的标记或无效的语句而出现错误。
请帮忙。
也欢迎任何其他删除前缀的建议,但需要使用转换。
考虑该问题的另一种方法是,您想查看 Name
列中的第一个“单词”,其中“单词”是从 collection 开始的字符字符串到第一个 space.
SSIS 中的字符串匹配是 case-sensitive,因此您需要强制第一个单词为 lower/upper 大小写 - 但是您的主标题列表是大小写的(然后确保标题列表全部lower/upper例)。
我提倡让自己的生活更轻松,所以我将添加一个派生列,实际上是很多派生列,它将标识名称中第一个 space 的位置,我将调用这个FirstSpace
DER GetFirstSpace
添加一个名为 FirstSpace
的新列。我们要使用的表达式是 FINDSTRING
FINDSTRING([Name], " ", 1)
这将 return 第一个实例的位置 space (如果没有找到 space 则为零)。
DER GetFirstWord
在 DER GetGetFirstSpace
之后添加另一个派生列。我们需要这样做,以便我们可以检查我们传递的值以获得第一个词。在单个 Derived 列中完成所有操作,当出现错误时,您将无法对其进行调试,而开发的真正成本是维护。新列 FirstWord
的类型为 DT_WSTR 4000,因为当您使用字符串操作表达式时会发生这种情况。我将强制使用大写字母,因为我稍后会需要它。
UPPER(SUBSTRING([Name], 1, [FirstSpace]))
- TODO:验证是“DR”还是“DR”,尾随 space,因为我目前正在凭记忆编码。
- TODO:如果 FirstSpace 为 0 会发生什么 - 我们可能需要使用三元运算符
?:
此时在数据流中,我们在名为 FirstWord
的列中有一个单词,我们需要做的是将其与我们的已知标题列表进行比较,如果存在,则将其从原版的。这是一个有趣的问题。
DER GetIsTitleMatched
再添加一个派生列,这次是为了解决我们是否匹配了我们的标题列表。这将是一个名为 IsTitleMatched
的布尔类型列
[FirstWord] == "DR" || [FirstWord] == "MRS" || [FirstWord] == "MR" || [FirstWord] == "MS"
遵循该模式“FirstWord 完全等于文字文本 OR...”,当此派生列计算时,我们将知道第一个单词是否是要删除的内容(最终)
DER 设置最终名称
这里我们要添加另一列,NameFinal
去除坏词的神奇之处在于我们使用从开头的位置开始的 RIGHT 表达式 space 和走到单词的末尾。根据 RIGHT 操作是否包含起点,您可能需要在其中添加左 TRIM。再次强调,目前的自由处理非常好,但不能保证完美。
(IsTitleMatched) ? RIGHT([Name], [FirstSpace]) : [Name]
我在这里确实违反了我自己的规则,因为在正例中我有一个准复杂的表达式。随意插入一个派生列任务来计算名称的剥离版本。
此时,您的数据流中有 4 到 5 个派生列,但您可以在每个列之间添加一个数据查看器,以确保获得预期的结果。欢迎您以自己的方式解决此问题,但这是我能想到的最简单的方法。
我在我的 SSIS 派生列中使用以下代码删除姓名列中的标题,例如先生、女士、女士和博士
例如:-
Mr ABC
MS XYZX
Mrs qwrer
DR ADCS
所以我要删除名字的标题。
SUBSTRING( [Name] , 1, 3)=="Mr" && LEN( [Name] ) >2 ? RIGHT([Name],LEN([Name])-2)
但是由于不完整的标记或无效的语句而出现错误。
请帮忙。
也欢迎任何其他删除前缀的建议,但需要使用转换。
考虑该问题的另一种方法是,您想查看 Name
列中的第一个“单词”,其中“单词”是从 collection 开始的字符字符串到第一个 space.
SSIS 中的字符串匹配是 case-sensitive,因此您需要强制第一个单词为 lower/upper 大小写 - 但是您的主标题列表是大小写的(然后确保标题列表全部lower/upper例)。
我提倡让自己的生活更轻松,所以我将添加一个派生列,实际上是很多派生列,它将标识名称中第一个 space 的位置,我将调用这个FirstSpace
DER GetFirstSpace
添加一个名为 FirstSpace
的新列。我们要使用的表达式是 FINDSTRING
FINDSTRING([Name], " ", 1)
这将 return 第一个实例的位置 space (如果没有找到 space 则为零)。
DER GetFirstWord
在 DER GetGetFirstSpace
之后添加另一个派生列。我们需要这样做,以便我们可以检查我们传递的值以获得第一个词。在单个 Derived 列中完成所有操作,当出现错误时,您将无法对其进行调试,而开发的真正成本是维护。新列 FirstWord
的类型为 DT_WSTR 4000,因为当您使用字符串操作表达式时会发生这种情况。我将强制使用大写字母,因为我稍后会需要它。
UPPER(SUBSTRING([Name], 1, [FirstSpace]))
- TODO:验证是“DR”还是“DR”,尾随 space,因为我目前正在凭记忆编码。
- TODO:如果 FirstSpace 为 0 会发生什么 - 我们可能需要使用三元运算符
?:
此时在数据流中,我们在名为 FirstWord
的列中有一个单词,我们需要做的是将其与我们的已知标题列表进行比较,如果存在,则将其从原版的。这是一个有趣的问题。
DER GetIsTitleMatched
再添加一个派生列,这次是为了解决我们是否匹配了我们的标题列表。这将是一个名为 IsTitleMatched
[FirstWord] == "DR" || [FirstWord] == "MRS" || [FirstWord] == "MR" || [FirstWord] == "MS"
遵循该模式“FirstWord 完全等于文字文本 OR...”,当此派生列计算时,我们将知道第一个单词是否是要删除的内容(最终)
DER 设置最终名称
这里我们要添加另一列,NameFinal
去除坏词的神奇之处在于我们使用从开头的位置开始的 RIGHT 表达式 space 和走到单词的末尾。根据 RIGHT 操作是否包含起点,您可能需要在其中添加左 TRIM。再次强调,目前的自由处理非常好,但不能保证完美。
(IsTitleMatched) ? RIGHT([Name], [FirstSpace]) : [Name]
我在这里确实违反了我自己的规则,因为在正例中我有一个准复杂的表达式。随意插入一个派生列任务来计算名称的剥离版本。
此时,您的数据流中有 4 到 5 个派生列,但您可以在每个列之间添加一个数据查看器,以确保获得预期的结果。欢迎您以自己的方式解决此问题,但这是我能想到的最简单的方法。