【问题标题】:Remove all character after nth underscore in Teradata sql删除 Teradata sql 中第 n 个下划线后的所有字符
【发布时间】:2019-01-30 06:56:13
【问题描述】:

我有一个值为 xxx_xxxx_xxxy_zzzz 的列,类似这样。我需要删除第 n 个之后的所有字符,或者假设列的给定值中的第三个下划线并在连接条件中使用剩余的字符串?

您的帮助将不胜感激。

谢谢, 阿图尔

【问题讨论】:

  • 您好,请提供一些信息,例如实际数据表列和异常输出以及您实际尝试的内容。
  • 嗨 Pascal,假设我在表的 X 列中有数据值为 atul_bajpayee_india,我必须将它与另一个表的 Y 列连接,该表的数据值为 atul_bajpayee。为了在 X= 上发生连接Y 我必须删除第三个下划线之后的所有值,包括下划线,然后只有数据值是相同的。简而言之,两个列在第二个下划线之前具有相同的值,第三个下划线之后的值更具定义性和差异性,这不是必需的,并且会导致连接问题。

标签: sql teradata


【解决方案1】:
SELECT SUBSTR('atul_bajpayee_india',1,REGEXP_INSTR('atul_bajpayee_india', '_', 1, 2, 0, 'c')-1);

这将用户 REGEXP_INSTR 在这种情况下找到第二个下划线作为 REGEXP_INSTR 中的第四个参数。这将返回字符串中的位置,然后可以使用该位置获取子字符串。 -1 不包括第二个下划线。

如果您要使用初始示例 'xxx_xxxx_xxxy_zzzz' 并想删除第三个下划线之后的所有内容,那将是

SELECT SUBSTR('xxx_xxxx_xxxy_zzzz',1,REGEXP_INSTR('xxx_xxxx_xxxy_zzzz', '_', 1, 3, 0, 'c')-1);

这里有一些很好的进一步阅读 http://www.teradatawiki.net/2014/05/regular-expression-functions.html

【讨论】:

    【解决方案2】:

    您可以使用 INSTR 查找搜索字符串的 nth 出现:

    Substr(col, 1, Instr(col, '_', 1, 3)-1)
    

    编辑:

    更好的方法是使用 REGEXP_SUBSTR:

    RegExp_Substr(col, '[^_]+(_[^_]+){0,n-1}')
    

    例如删除第三个下划线后的所有内容:

    RegExp_Substr('xxx_xxxx_xxxy_zzzz', '[^_]+(_[^_]+){0,2}')
    

    如果下划线少于 n 个,这也有效

    【讨论】:

    • 以上行不通,instr 需要 4 个参数。 INSTR(source_string, search_string,position,occurrance) SUBSTR(col,1,INSTR(col,'_',1,n)-1) [见上面的答案] -1 需要不包括正在查看的第 n 个下划线对于
    【解决方案3】:

    简单的解决方案可能是使用这个:

    select STRTOK( 'xxx_xxxx_xxxy_zzzz', '_', 4);
    

    这会给你“zzzz”令牌。

    【讨论】:

    • 但它应该返回xxx_xxxx_xxxy :-)
    • 原始请求是:“我需要删除第 n 个之后的所有字符,或者假设列的给定值中的第三个下划线并使用剩余的字符串” - 所以它会这样做,不是吗?跨度>
    猜你喜欢
    • 2021-02-15
    • 2019-12-22
    • 1970-01-01
    • 2021-01-01
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 2019-07-05
    相关资源
    最近更新 更多