【问题标题】:SSIS How to get part of a string by separatorSSIS如何通过分隔符获取字符串的一部分
【发布时间】:2012-06-10 21:46:37
【问题描述】:

我需要一个 SSIS 表达式来获取分隔符之前的字符串左侧部分,然后将新字符串放入新列中。我检查了派生列,似乎没有这样的表达式。 Substring 只能返回固定长度的字符串部分。

例如,带有分隔符字符串-

Art-Reading                Should return Art
Art-Writing                Should return Art
Science-chemistry          Should return Science

附: 我知道这可以在 MySQL 中使用SUBSTRING_INDEX() 完成,但我正在寻找 SSIS 中的等价物,或者至少在 SQL Server 中寻找一个等价物

【问题讨论】:

标签: sql-server ssis expression etl


【解决方案1】:

如果 SUBSTRING 长度参数返回 -1 那么它会导致错误, "长度 -1 对函数 "SUBSTRING" 无效。长度参数不能为负数。请将长度参数更改为零或正值。"

【讨论】:

    【解决方案2】:

    迟到总比没有好,但我也想这样做并找到了。

    TOKEN(character_expression, delimiter_string, occurrence)
    
    TOKEN("a little white dog"," ",2)
    

    返回很少的来源在下面

    http://technet.microsoft.com/en-us/library/hh213216.aspx

    【讨论】:

    • 这可能是这里最好的答案。
    • 我一直在寻找这个!!最佳答案
    【解决方案3】:

    当然可以:

    只需像这样配置您的派生列:

    这是让您的生活更轻松的表达方式:

    SUBSTRING(name,1,FINDSTRING(name,"-",1) - 1)
    

    仅供参考,第二个“1”表示获取字符串“-”的第一次出现

    编辑: 处理不带“-”的字符串的表达式

    FINDSTRING(name,"-",1) != 0 ? (SUBSTRING(name,1,FINDSTRING(name,"-",1) - 1)) : name
    

    【讨论】:

    • 非常感谢您的回答!!但是,“name”列的某些值没有分隔符,在这种情况下,我希望“new_name”列与“name”相同。例如。其中一个名称是“Science”,而 new_name 就是“Science”。所以整个过程是这样的:如果name有分隔符,则使用解决方案,否则,从name复制到new_name
    • 可以用条件表达式轻松解决。查看我的编辑!
    【解决方案4】:

    您可以在SUBSTRING 函数中指定要复制的长度,并使用CHARINDEX 检查破折号的位置

    SELECT SUBSTRING(@sString, 1, CHARINDEX('-',@sString) - 1)
    

    对于 SSIS 表达式,代码几乎相同:

    SUBSTRING(@[User::String], 1, FINDSTRING(@[User::String], "-", 1)-1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-03
      • 2012-07-31
      • 2014-03-02
      • 2015-08-18
      相关资源
      最近更新 更多