我必须在特殊字符的第n和第n次出现之间从表中选择一个子字符串(比如 - )。
例如:如果列数据是' a-b-c-d-e-f-g-h ', n 2 & m 5 ,我的select语句应返回:' c-d-e '
我尝试了各种正则表达式组合,但我认为' \ K'不能使用。
请帮忙。
答案 0 :(得分:3)
您可能想尝试使用instr
,如下所示:
with PARAM as (select 'a-b-c-d-e-f-g-h' as S,
'-' as D, 2 as N, 5 as M from dual)
select substr(substr(S, instr(S, D, 1, N) + 1),
1, instr(S, D, 1, M - N) - 1) as RANGE
from PARAM;
with
语句就是为了使表达式更清晰。
S
是输入字符串。 D
是分隔符。
如果想要使用正则表达式,那么您可以尝试这样做:
with PARAM as (select 'a-b-c-d-e-f-g-h' as S,
'-' as D, 2 as N, 5 as M from dual)
select -- ^([^D]*D){N}([^D]*(D[^D]*){M-N-1}).*$
regexp_replace(S, '^([^'||D||']*'||D||'){'||N||'}([^'||D||']*('||D||'[^'||D||']*){'||(M-N-1)||'}).*$', '\2') as RANGE
from PARAM;
正则表达式首先跳过N
组文本和分隔符(([^D]*D){N}
),然后形成一个文本的组\2
,后跟M-N-1
组文本和分隔符(([^D]*(D[^D]*){M-N-1}
)。
在正则表达式方法中,必须引用正则表达式中具有特殊含义的分隔符。
答案 1 :(得分:0)
您可以尝试以下方法:
选择substr(' abcdefg-h',instr(' abcdefg-h',' - ',1,2)+1,5)从双重出现;