Боюсь, что регулярное выражение формы '[^#]+'
не обрабатывает NULL-элементы. К сожалению, это самый распространенный ответ на вопросы о разборе строк с разделителями. Для доказательства и подробностей см. Пост: https://stackoverflow.com/a/31464699/2543416. Используя его, набор данных с элементом NULL 2 дает следующий набор результатов:
SUBS
-----------
substr1
substr3
substrN
<NULL here>
SQL>
Вместо этого используйте эту форму, построенную на ответе Littlefoot (элемент примечания 2 равен NULL):
with test as (select 'substr1##substr3#substrN' col from dual)
select regexp_substr(col, '(.*?)(#|$)', 1, level, NULL, 1) subs
from test
connect by regexp_substr(col, '(.*?)(#|$)', 1, level) is not null;
SUBS
-----------
substr1
substr3
substrN
SQL>
Здесь NULL 2-го элемента сохраняется, а остальные значения находятся в правильной позиции.
В вашем случае вы можете не заботиться о положении значения, просто о том, что оно находится в списке. Но, для удобства использования (и для точности), вы можете превратить это в функцию, в которой вы передаете строку, разделитель и значение, которое вы ищете, и получите возврат своей позиции. Ненулевое значение означает, что оно есть в списке, и у вас есть его позиция, если это когда-либо понадобится. Просто мысль.