Это знакомая проблема . Используйте другой шаблон, поскольку этот ответ предполагает:
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.