使用正确函数时的 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 个派生列,但您可以在每个列之间添加一个数据查看器,以确保获得预期的结果。欢迎您以自己的方式解决此问题,但这是我能想到的最简单的方法。