我有一个用#
分隔的字符串,我希望该字符串中的第三个集合/单元格。
例如:
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
,因为##
之间的第三个单元为空。
答案 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
找到#
字符的第三个外观并减去第二个外观(因此它创建了子字符串长度)