如何在Oracle中使用REGEXP_SUBSTR从定界字符串中获取第n个字符串

时间:2019-04-10 15:53:43

标签: oracle regexp-substr

我有一个用#分隔的字符串,我希望该字符串中的第三个集合/单元格。

例如:

select REGEXP_SUBSTR( 'abc#def##########xyz','[^#]+', 1,1,null) from dual;

输出:abc

select REGEXP_SUBSTR( 'abc#def##########xyz','[^#]+', 1,2,null) from dual;

输出:def

但是

select REGEXP_SUBSTR( 'abc#def##########xyz','[^#]+', 1,3,null) from dual;

输出:xyz

但是我期望得到null,因为##之间的第三个单元为空。

2 个答案:

答案 0 :(得分:3)

这是a familiar issue。使用该答案所建议的其他模式:

select REGEXP_SUBSTR( 'abc#def##########xyz','(.*?)(#|$)', 1, 1, null, 1) from dual;

abc

select REGEXP_SUBSTR( 'abc#def##########xyz','(.*?)(#|$)', 1, 2, null, 1) from dual;

def

select REGEXP_SUBSTR( 'abc#def##########xyz','(.*?)(#|$)', 1, 3, null, 1) from dual;

(null)

select REGEXP_SUBSTR( 'abc#def##########xyz','(.*?)(#|$)', 1, 12, null, 1) from dual;

xyz

或通过分层查询(或递归CTE)一次获得所有这些信息:

select level as pos,
  REGEXP_SUBSTR( 'abc#def##########xyz','(.*?)(#|$)', 1, level, null, 1) as result
from dual
connect by level <= regexp_count('abc#def##########xyz', '#') + 1;

       POS RESULT              
---------- --------------------
         1 abc                 
         2 def                 
         3 (null)              
         4 (null)              
         5 (null)              
         6 (null)              
         7 (null)              
         8 (null)              
         9 (null)              
        10 (null)              
        11 (null)              
        12 xyz                 

12 rows selected. 

答案 1 :(得分:0)

SUBSTR + INSTR组合怎么样?

SQL> with test (col) as (select 'abc#def##########xyz' from dual)
  2  select substr(col, instr(col, '#', 1, 2) + 1,
  3                     instr(col, '#', 1, 3) - instr(col, '#', 1, 2) - 1
  4               ) third_string,
  5         --
  6         substr(col, instr(col, '#', 1, 1) + 1,
  7                     instr(col, '#', 1, 2) - instr(col, '#', 1, 1) - 1
  8               ) second_string
  9  from test;

THIRD_STRING    SECOND_STRING
--------------- ---------------
                def

SQL>

second_string解释了(一种更简单的情况,因为它实际上会返回某物):

  • 第一行INSTR查找#字符的第二次出现
  • 第二行INSTR找到#字符的第三个外观并减去第二个外观(因此它创建了子字符串长度)