【问题标题】:Oracle 11g: Substring between nth & mth occurranceOracle 11g:第 n 次和第 n 次出现之间的子字符串
【发布时间】:2015-11-16 16:41:06
【问题描述】:

我必须从一个特殊字符(比如 -)出现的第 n 次和第 m 次之间的表中选择一个子字符串。

例如:如果列数据为 'abcdefgh',则 n2 & m5,我的选择语句应该返回:'cde'

我尝试了各种正则表达式组合,但我认为 '\K' 不能使用。

请帮忙。

【问题讨论】:

    标签: regex oracle oracle11g substring


    【解决方案1】:

    您可能想尝试像这样使用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})。

    在正则表达式方法中,正则表达式中具有特殊含义的分隔符必须被引用。

    【讨论】:

      【解决方案2】:

      您可以尝试以下方法:

      从对偶中选择 substr('a-b-c-d-e-f-g-h',instr('a-b-c-d-e-f-g-h','-',1,2)+1,5) 作为出现;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-16
        • 2022-01-18
        • 1970-01-01
        • 2021-04-07
        • 2021-02-10
        • 2010-12-25
        • 2016-05-07
        相关资源
        最近更新 更多