[英]Find a 2nd set of digit in a string(SQL/PL-SQL)
我有一个字符串,可能是以下类型
string expected result
15-th-rp 15
15/12-rp 12
15-12-th 12
4-5-6 5
现在我必须找到数字,1)如果一个字符串只包含1digit,那么将显示相同的数字。 2)如果字符之间有多组数字,那么我必须找到第二组数字。 请帮我。
with a as (
select '15-th-rp' as data from dual
union all
select '15/12-rp' from dual
union all
select '15-12-th' from dual
union all
select '4-5-6' from dual
)
select regexp_substr(data,'[0-9]+',REGEXP_INSTR(data,'[/|-]')+1) from a;
我想这就是你所追求的:
with a as (select '15-th-rp' data from dual union all
select '15/12-rp' data from dual union all
select '15-12-th' data from dual union all
select '4-5-6' data from dual)
select data,
coalesce(regexp_substr(data,'[0-9]+',1,2),
regexp_substr(data,'[0-9]+',1,1)) extracted_data
from a;
DATA EXTRACTED_DATA
-------- --------------
15-th-rp 15
15/12-rp 12
15-12-th 12
4-5-6 5
使用COALESCE的好处是它不会评估第二个(和后续的)参数,除非它们是必需的。
你没有回答关于'_1_2'
是否应该返回1
或2
,所以我假设你想要1
。
REGEXP_SUBSTR(data, '[0-9]+', REGEXP_INSTR(data, '[^0-9][0-9]')+1)
从_1_2
获得2
一种有点hacky方式(同时也应对_1
让步1
)可能是......
REGEXP_SUBSTR(data || '_' || data, '[0-9]+', 1, 2)
SQL小提琴: http ://sqlfiddle.com/#!4/a54bb/7
分2步完成。 首先匹配模式的第一个和第二个出现,然后仅在没有第二个集合时显示第一个集合(即它为空)。
with
a(data) as (
select '15-th-rp' from dual union all
select '15/12-rp' from dual union all
select '15-12-th' from dual union all
select '4-5-6' from dual
),
b(data, first, second) as (
select
data
,regexp_substr(data, '[[:digit:]]+')
,regexp_substr(data, '[[:digit:]]+', 1, 2)
from a
)
select data, nvl(second, first) as result from b;
返回结果:
DATA RESULT
-------- ------
15-th-rp 15
15/12-rp 12
15-12-th 12
4-5-6 5
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.