我需要你们的紧急帮助,我有一个代表用户全名的列,现在我想把它分成名字和姓氏。
Full name 的格式是“World, hello”,现在这里的名字是hello,姓氏是world。
我正在使用派生列(SSIS)并为名字使用右函数,为姓氏使用子字符串函数,但这些结果似乎是空白的,即使我也是空白的。:)
它对我有用。一般来说,您应该在问题中提供更多关于此类位置的详细信息,以帮助其他人重新创建和解决您的问题。您没有指定我们是否需要解决此字段中的 NULL,我也不知道您想如何解释它,因此这个答案还有改进的余地。
我从一个简单的 OLE DB 源开始,硬编码了一个查询“SELECT 'World, Hello' AS Name”。
我创建了 2 个派生列任务。第一个向数据流中添加了一个名为 FirstCommaPosition 的列。我使用的公式是FINDSTRING(Name,",", 1)
如果 NAME 可以为空,那么我们需要在调用 FINDSTRING 函数之前测试可空性。然后,您需要确定在 NULL 的情况下如何存储拆分数据。我会假设第一个和最后一个都应该为空,但我不知道。
在不同的步骤中执行此操作有两个原因。首先是性能。听起来有悖常理,在派生列中做的更少会带来更好的性能,因为 SSIS 引擎可以更好地并行化操作。另一个更简单 - 我将需要使用此值来拆分名字和姓氏,因此引用列比复制粘贴公式更容易且维护更少。
第二个派生列将实际执行拆分。
我的 FirstNameUnicode 列使用这个公式(FirstCommaPosition > 0) ? RTRIM(LTRIM(RIGHT(Name,FirstCommaPosition))) : ""
说“如果我们在前面的步骤中找到了一个逗号,那么从逗号的位置到字符串末尾的所有内容都切掉并应用修剪操作。如果我们没有找到一个逗号,那么就返回一个空白字符串。表达式的默认字符串类型将是 Unicode (DT_WSTR),因此如果您不需要,您需要将结果转换为正确的字符串代码页 (DT_STR)
我的 LastNameUnicode 列使用这个公式(FirstCommaPosition > 0) ? SUBSTRING(Name,1,FirstCommaPosition -1) : ""
与上面类似的逻辑,除了现在我使用 SUBSTRING 操作而不是 RIGHT。SSIS 2012 版及更高版本的用户很高兴您可以使用 LEFT 函数而不是 SUBSTRING。另请注意,您需要后退 1 个位置才能删除逗号。