【问题标题】:Using REGEXP in oracle在 oracle 中使用正则表达式
【发布时间】:2020-03-23 13:21:09
【问题描述】:

我有一列填充了这种类型的数据

AR001-330110092522102
AR001-330335000041402
AR001-330410092999901

问题是,我只想要破折号后面的数字 我想要的输出是

330110092432102
330335091341402
330410092015901

我如何在 oracle 中使用REGEXP 来完成此操作

列名是identifier,表名是NSUS

【问题讨论】:

  • 虽然您可以使用 REGEXP 函数,但我会考虑在这种情况下使用标准函数,因为 REGEXP 会为您的查询增加大量开销,而您实际上并不需要正则表达式的强大功能。

标签: sql regex oracle substr regexp-replace


【解决方案1】:

您可以使用 select regexp_substr'[^-]+$' 模式作为:

select regexp_substr('AR001-330110092522102','[^-]+$') as "Result String" from dual 

在哪里

  • [^-] 指出除了字符(破折号)之外的起点 列表
  • $ 匹配字符串的结尾。
  • 匹配一个或多个匹配项。

另一种选择是使用regexp_replace

select regexp_replace('AR001-330110092522102','(.*)\-(.*)','\2') as "Result String" from t 

确实,您还可以使用substr()instr()length() 函数组合来提取这些字符串,例如

with t(str) as
(select 'AR001-330110092522102' from dual)
select substr(str,instr(str,'-')+1,length(str)) as "Result String" from t

Demo

【讨论】:

    【解决方案2】:

    你可以使用一个非常基本的正则表达式:.* 这意味着“接受任何字符”——您只需要告诉它在字符串中的'-' 之后开始,您可以使用INSTR 函数获得它的位置。所以你最终得到:

    SELECT REGEXP_SUBSTR(YOUR_COLUMN, '.*', INSTR(YOUR_COLUMN, '-')+1)
      FROM YOUR_TABLE;
    

    db<>fiddle here

    【讨论】:

      【解决方案3】:

      您要查找的正则表达式是:-([0-9])+$

      这意味着您正在寻找字符串末尾的“-”和至少一个数字。 “$”表示在字符串的末尾。

      然后使用 $1 获取您的号码(这是您的捕获组)

      用这个来测试:https://regex101.com/r/f9kwXV/17

      编辑:我不确定这在 oracle 中是否有效。示例:

      SELECT REGEXP_REPLACE ('AR001-330335000041402', '-([0-9])+$', '$1')
      FROM dual;
      

      【讨论】:

      • 嘿,还是不太明白,可以举个例子吗
      猜你喜欢
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-14
      • 2021-05-22
      相关资源
      最近更新 更多