Oracle SQL:Regexp\u substr
我在一列中有以下示例值Oracle SQL:Regexp\u substr,sql,regex,oracle,Sql,Regex,Oracle,我在一列中有以下示例值 Abc-123-xyz Def-456-uvw Ghi-879-rst-123 jklabc 预期输出是由“-”分割的第三个元素,如果没有第三个元素,将检索最后一个元素 见下文预期产出: Xyz 紫外线 Rst Abc 感谢您的帮助。另一种方法: SELECT initcap(nvl(regexp_substr(word, '[^-]+', 1,3),regexp_substr(word, '[^-]+', 1,2))) FROM your_table; SQL&
Abc-123-xyz
Def-456-uvw
Ghi-879-rst-123
jklabc
预期输出是由“-”分割的第三个元素,如果没有第三个元素,将检索最后一个元素
见下文预期产出:
Xyz
紫外线
Rst
Abc
感谢您的帮助。另一种方法:
SELECT initcap(nvl(regexp_substr(word, '[^-]+', 1,3),regexp_substr(word, '[^-]+', 1,2))) FROM your_table;
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
您也可以在不使用正则表达式的情况下执行此操作:
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
;
欢迎来到堆栈溢出。您可以使用工具栏按钮格式化源代码和数据示例。这一次我是为你们做的。在你们的问题标题中不是regex\u substr,oracle让regexp\u substr为你们所有人做编辑。下一个问题将有所改进。请注意,REGEXP_COUNT()仅在11g中引入(其他regex函数在10g中可用),感谢您的回答^ ^ ^是的,我的错,我以为他总是想得到最后三个字符。。。
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
;