【问题标题】:How to get fixed length number from a string in oracle如何从oracle中的字符串中获取固定长度的数字
【发布时间】:2015-12-03 04:35:24
【问题描述】:

我想从 var-char 字段中获取固定长度的数字。假设我有一个像 text1234567890fortex23466666sortes1234567890123 这样的字符串,那么我想获取哪个数字在字符之间连续固定 10 位数字,即 1234567890 并且我的数据也像 @ 987654323@ 那么输出应该是 0987654321

【问题讨论】:

    标签: sql oracle oracle11g


    【解决方案1】:

    使用

    Select regexp_substr ( <text>, '(^|[^0-9])[0-9]{10}([^0-9]|$)' ) from dual;
    

    提取第一次出现的最大 10 位数字。您必须对结果进行后处理以删除封闭的非数字。重复基于正则表达式的提取的完整解决方案是:

    Select regexp_substr (
                 regexp_substr ( <text>, '(^|[^0-9])[0-9]{10}([^0-9]|$)' ) 
               , '[0-9]{10}'
           )
      from dual
         ;
    

    或者,按案例分解预处理:

    Select case length(i.interim)
               When 10 then i.interim
               When 12 then substr(i.interim, 2, 10 )
               Else case when regexp_instr(i.interim, '[0-9]') = 1
                         Then substr ( i.interim, 1, 10 )
                         Else substr ( i.interim, 2 )
                    End
           End
      From (
               Select regexp_substr ( <text>, '(^|[^0-9])[0-9]{10}([^0-9]|$)' ) interim from dual
           ) i
         ;
    

    如果你想避免多次调用正则表达式函数,你需要求助于regexp_replace

    Select regexp_replace( <text>, '^(.*[^0-9])?([0-9]{10})([^0-9].*)?$', '\2' ) from dual;
    

    注意

    在 12c 中,regexp_substr 补充了一个新参数,以返回一个完整匹配的捕获组:

    Select regexp_substr ( <text>, '(^|[^0-9])([0-9]{10})([^0-9]|$)', 1, 1, '', 2 ) from dual;
    

    最后一个参数表示捕获组,中间的参数分别表示匹配、出现和匹配参数的开始位置;详情请见the oracle docs

    【讨论】:

    • 谢谢,您的第一个解决方案工作正常,但不是使用两次 REGEXP_SUBSTR 而是使用单个 REGEXP_SUBSTR 可以获得相同的结果
    • 在 11g2 中,regexp_substr 只能提取整个匹配项。这将包括任何周围的非数字。 Afaik Oracle 的正则表达式语法不支持环视语法。 12c 向 regexp_substr 引入了一个新参数,该参数指定要返回的捕获组,而不是完全匹配。或者,使用 regexp_replace(调整模式以匹配完整的字符串)。我会相应地补充我的答案。
    • 我们只使用 oracle12c。您能否在 12c 中使用单个 REGEXP_SUBSTR 提供相同的功能
    猜你喜欢
    • 2020-01-14
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    相关资源
    最近更新 更多