Oracle SQL:正则表达式_substr

Posted

技术标签:

【中文标题】Oracle SQL:正则表达式_substr【英文标题】:Oracle SQL : Regexp_substr 【发布时间】:2013-07-30 08:11:13 【问题描述】:

我在一列中有以下示例值

Abc-123-xyz
Def-456-uvw
Ghi-879-rst-123
Jkl-abc

预期输出是被'-'分割的第三个元素,如果没有第三个元素,则检索最后一个元素。

请参阅下面的预期输出:

Xyz
Uvw
Rst
Abc

感谢您的帮助。

【问题讨论】:

欢迎来到 Stack Overflow。您可以使用Code Sample 工具栏按钮格式化源代码和数据示例。这次我替你做了。 问题标题中不是 regex_substr,oracle 有 regexp_substr 感谢大家的编辑。我的问题接下来会改进。 【参考方案1】:
SELECT initcap(nvl(regexp_substr(word, '[^-]+', 1,3),regexp_substr(word, '[^-]+', 1,2)))  FROM your_table;

【讨论】:

感谢您的回答^_^【参考方案2】:

另一种方法:

SQL> with t1(col) as(
  2    select 'Abc-123-xyz'     from dual union all
  3    select 'Def-456-uvw'     from dual union all
  4    select 'Ghi-879-rst-123' from dual union all
  5    select 'Jkl-Abc'         from dual
  6  )
  7  select regexp_substr( col
  8                      , '[^-]+'
  9                      , 1
 10                      , case
 11                           when regexp_count(col, '[^-]+') >= 3
 12                           then 3
 13                           else regexp_count(col, '[^-]+')
 14                        end
 15                      ) as res
 16    from t1
 17  ;

结果:

RES
---------------
xyz
uvw
rst
Abc

【讨论】:

请注意,REGEXP_COUNT() 仅在 11g 中引入(其他正则表达式函数在 10g 中可用)【参考方案3】:
regexp_substr(column, '(.*?-)0,2([^-]+)', 1, 1, '', 2)

【讨论】:

【参考方案4】:

你也可以不使用 RegEx:

with t1 as(
  select 'Abc-123-xyz' as MyText     from dual union all
  select 'Def-456-uvw'     from dual union all
  select 'Ghi-879-rst-123' from dual union all
  select 'Jkl-Abc'         from dual
)
SELECT 
  SUBSTR(t1.mytext, LENGTH(t1.mytext) - INSTR(REVERSE(t1.mytext), '-') + 2) 
FROM t1
;

【讨论】:

^ 是的,我的错,我以为他总是想得到最后三个字符...

以上是关于Oracle SQL:正则表达式_substr的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL 正则表达式 (regexp_substr)

Oracle中REGEXP_SUBSTR及其它支持正则表达式的内置函数小结

Oracle SQL 正则表达式 RegExp_SubStr End Of Line (chr(10) 在搜索文本中返回 null

Oracle 正则表达式函数-REGEXP_SUBSTR 使用例子

oracle SQL 正则表达式

Oracle 正则表达式的误解