【问题标题】:Get a word after specific word using regexp_substr in sql oracle在sql oracle中使用regexp_substr获取特定单词之后的单词
【发布时间】:2020-09-15 20:49:42
【问题描述】:

我试过了

select regexp_substr ('sys: error: This is a message ''123:'' for column EMP_NB', '[[:alpha:]_]+',1,9) from dual

我的列中填充了这种类型的数据。

sys: error: This is a message '123:' for column EMP_NB.  
sys: error: This is a message '45346:' for column EM_NM.  
sys: error: This is a message '78324f9:' for column DEPT_NO_VL.

我需要在 Oracle SQL 中使用 regexp_substr 得到如下输出。挑战在于字符串的长度会发生变化,我只需要提取字符串中column 之后的字符。

预期输出:

EMP_NB
EM_NM
DEPT_NO_VL

【问题讨论】:

    标签: sql regex oracle


    【解决方案1】:

    你可以使用

    select regexp_substr ('sys: error: This is a message ''123:'' for column EMP_NB', 'column[[:space:]]*([[:alpha:]_]+)', 1, 1, NULL, 1) from dual
    

    这里,

    • column - 匹配 column
    • [[:space:]]* - 0 个或更多空白字符
    • ([[:alpha:]_]+) - 将任何一个或多个字母或下划线捕获到第 1 组中。

    仅返回捕获的值,因为最后一个组 ID 参数设置为 1

    【讨论】:

    • 我也试过这个,我可以看到这个比另一个更有效。非常感谢
    【解决方案2】:

    只需将模式锚定到字符串的末尾即可:

    select regexp_substr('sys: error: This is a message ''123:'' for column EMP_NB', '[[:alpha:]_]+$')
    from dual
    

    Here 是一个 dbfiddle。

    您的示例数据末尾有句点。如果这是字符串的一部分,那么您可以使用regexp_replace():

    select regexp_replace(message, '^.*[^[:alpha:]_]([[:alpha:]_]+)[^[:alpha:]_]*$', '\1')
    from (select 'sys: error: This is a message ''123:'' for column EMP_NB' as message from dual union all
          select 'sys: error: This is a message ''45346:'' for column EM_NM.' as message from dual union all
          select 'sys: error: This is a message ''78324f9:'' for column DEPT_NO_VL.' as message from dual
         ) x
    

    【讨论】:

      猜你喜欢
      • 2019-03-21
      • 2021-08-01
      • 1970-01-01
      • 2021-07-04
      • 2021-07-04
      • 1970-01-01
      • 2022-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多