【问题标题】:Remove all characters after a specific character in PL/SQL [duplicate]删除 PL/SQL 中特定字符之后的所有字符 [重复]
【发布时间】:2011-10-10 19:22:50
【问题描述】:

如何从这个示例值中获取子字符串:

 john.abc_1234

我希望它返回john.abc。所以基本上我们需要删除_之后的所有信息。

更多示例:1234_abc

【问题讨论】:

标签: sql oracle plsql oracle9i substr


【解决方案1】:

您可以使用SUBSTRINSTR

select substr('john.abc_1234', 1, instr('john.abc_1234', '_') -1)
from dual

警告:只有当您的字符串中确实有下划线时,才能保证有效

更新

此外,如果您从 Oracle 10g 开始运行,您可以采用 Regex 路径,这样可以更有效地处理异常。

以下是有关如何在 Oracle 中执行此操作的一些链接:

【讨论】:

  • 很高兴为您提供帮助。确保您支持/接受对您有帮助的答案
  • @Adrian,正则表达式在 9i 中可用吗?我以为它们只有 10 克以上?
  • @Ben 我完全错过了 oracle9i 标签。我猜 Regex 只能从 10 日开始使用。
  • 为了有一个正则表达式的例子,这里有一个正则表达式的方法:select regexp_substr('john.abc_1234', '[^_]*') from dual; 它假设你想保持所有直到第一个下划线。
  • select regexp_replace('john.abc_1234', '(.*)_.*','\1') from dual 可能用于版本 10+
【解决方案2】:

您可以通过substr(..)instr(...) 的简单组合来查找不含underscore 特殊字符的字符串。此外,为了只选择包含字符串的_,您可以使用额外的where 子句,如下所示

       select substr('john.abc_1234', 1, 
       instr('john.abc_1234', '_') -1)
      from dual where 
      instr('john.abc_1234', '_')>0

【讨论】:

    【解决方案3】:

    当你不确定你的所有值是否都包含你想要切断字符串的字符时,你可以使用这个怪物。

    SELECT
        (CASE WHEN INSTR(field, '_') > 0
            THEN substr(field, 1, instr(field, '_') -1)
            ELSE field
        END) AS field
    FROM
        dual
    

    【讨论】:

      【解决方案4】:

      这家伙想通了! http://programcsharp.com/blog/post/strip-non-numeric-characters-from-a-string-in-sql-server

      SELECT
          (SELECT CAST(CAST((
              SELECT SUBSTRING(FieldToStrip, Number, 1)
              FROM master..spt_values
              WHERE Type='p' AND Number <= LEN(FieldToStrip) AND
                  SUBSTRING(FieldToStrip, Number, 1) LIKE '[0-9]' FOR XML Path(''))
          AS xml) AS varchar(MAX)))
      FROM
          SourceTable
      

      【讨论】:

        猜你喜欢
        • 2012-03-08
        • 2016-08-09
        • 1970-01-01
        • 2010-10-28
        • 1970-01-01
        • 2019-12-22
        • 1970-01-01
        相关资源
        最近更新 更多