我正在使用Oracle,
在一个专栏中我得到的数据如下:
my_name 1234
my_name1 1234
my name (1234)
my name : 1234
这些是名称和ID(数字) 名称也可以包含数字,但ID始终是4-6位数
我只对ID感兴趣。 我对JS和Perl中的正则表达式有很好的理解,但我在Oracle SQL中不知道它
我试过这个:regexp_replace('my_name - 7203', '[^[:digit:]]')
哪个工作正常但在名称包含数字的情况下失败..
答案 0 :(得分:2)
试试这个:
select regexp_replace('my_4name - 7203', '.*?([[:digit:]]+)[)]?$','\1') from dual;
愿这对你有所帮助。
答案 1 :(得分:0)
这不是一个漂亮的解决方案,它应该按你的意愿工作。此外,我在子查询上将其分解为更难以理解。
最后的替换将是:
substr( trim(regexp_replace(name, '[^[:digit:]]', ' ')),
regexp_instr( trim(
regexp_replace(name,
'[^[:digit:]]', ' ')), '[^[:digit:]]')+1,
length(trim(regexp_replace(name, '[^[:digit:]]', ' ')))) as ID
在此处查看:
select substr( trim(regexp_replace(name, '[^[:digit:]]', ' ')),
regexp_instr(trim(
regexp_replace( name,
'[^[:digit:]]',
' ')), '[^[:digit:]]')+1,
length(trim(regexp_replace(name, '[^[:digit:]]', ' ')))) as ID
from ( select 'my_name 1234' name from dual union all
select 'my_name1 1234' name from dual union all
select 'my name (1234)' name from dual union all
select 'my_name1:1234' name from dual union all
select 'my name : 1234' name from dual)
这是要修改的版本:
select substr( justNumbers,
regexp_instr(justNumbers, '[^[:digit:]]')+1,
length(justNumbers)) as ID
from (select trim(regexp_replace(name, '[^[:digit:]]', ' ')) as justNumbers
from ( select 'my_name 1234' name from dual union all
select 'my_name1 1234' name from dual union all
select 'my name (1234)' name from dual union all
select 'my_name1:1234' name from dual union all
select 'my name : 1234' name from dual)
)
我们的想法是只留下数字,然后从下一个不是数字的字符+1中获取数字(regexp_instr(justNumbers, '[^[:digit:]]')+1
)。
答案 2 :(得分:0)
这个正则表达式:[ \W ]+ ( \d\d\d\d [\d]? [\d]? )
似乎有效。
此处的模式基于ID为4-6位长的数据 - \d\d\d\d [\d]? [\d]?
...如果要接受的ID超过六位数,您可以将[\d]?[\d]?
替换为[\d]*
。此外,假设是ID将以非字母字符作为前缀
示例: :
,space
,(
等...
\W
会在“名称”和“ID”之后区分任意数量的数字。
测试运行:
input- my name123456789:12345
output- 12345