【问题标题】:Oracle SQL - Removing leading patterned substringOracle SQL - 删除前导模式子字符串
【发布时间】:2017-11-09 13:38:23
【问题描述】:

我在 Oracle 12cR1 数据库中有一个数据字段。该字段是一个产品描述符,该字段的开头包含产品 ID。然后是产品名称。我需要去掉产品 ID。产品 ID 可以是 2 种格式之一...数据通常如下所示:

  • 0P3H - 作品 NEM
  • 0P22 - 40021 - 订单捕获自助服务

请注意,在某些情况下,“-”字符是产品名称的一部分,例如

  • 0C34 - 人力资源 - 促销模块

据我所知,当它位于字符串的开头时,我需要删除以下内容......

  • 4 个字符,然后是空格,然后是破折号,然后是空格
  • 4 个字符,然后空格,然后破折号,然后空格 5 个字符,空格破折号 空间

我将如何编写 Oracle SQL 来读取字段并删除这 2 个不同的子字符串?

谢谢!

【问题讨论】:

标签: sql regex oracle


【解决方案1】:

根据您的描述,case 可能是最简单的:

select (case when field like '____ - _____ -%' then substr(field, 15)
             else substr(field, 7)
        end)

【讨论】:

  • 这行得通,虽然我必须添加 '%' ,就像这样...选择(当字段像 '____ - _____ -%' 然后 substr(field, 15) else substr(field , 7)
【解决方案2】:

与第一个'-'相反的子字符串,然后从该起始位置到字符串的末尾。

select TRIM(substr('0P3H - Opus NEM', instr('0P3H - Opus NEM', '-', -1, 1) + 1)) from dual

select TRIM(substr('0P22 - 40021 - Order Capture Self Service', instr('0P22 - 40021 - Order Capture Self Service', '-', -1, 1) + 1)) from dual

【讨论】:

  • 抱歉,我刚刚注意到您提到在某些情况下,“-”可以是名称的一部分。在那种情况下,我描述的方法将不起作用。
猜你喜欢
  • 2019-02-06
  • 2012-02-06
  • 1970-01-01
  • 2014-03-15
  • 2014-10-19
  • 2021-04-19
  • 1970-01-01
  • 1970-01-01
  • 2014-10-31
相关资源
最近更新 更多