繁体   English   中英

在字符串中查找第二组数字(SQL / PL-SQL)

[英]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'是否应该返回12 ,所以我假设你想要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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM