Во-первых, было бы упущением, если бы я не указал будущим поисковикам, что хранение более одного фрагмента информации в одном столбце нарушает первую нормальную форму проектирования базы данных и не доставит вам ничего, кроме неприятностей в будущем. Поскольку вы исправляете это, я приветствую вас!
Во-вторых, использование шаблона регулярного выражения в форме '[^;]+'
для анализа строк с разделителями завершается неудачно, когда в списке есть нулевые элементы. Смотрите здесь для получения дополнительной информации о том, почему это плохая идея: https://stackoverflow.com/a/31464699/2543416
Теперь я не весь мрак и мрак! Я не знаю, какой набор символов вы используете, но вы поймете. В этом примере используется форма регулярного выражения, которая допускает элементы списка NULL и 1 или более точек с запятой, за которыми следует пробел ИЛИ конец строки.
with tbl(id, str) as (
select 1, '119021-1, г Москва, ул Льва Толстого, д 16; 117312-1, г Москва, ул Вавилова, д 19' from dual union all
select 2, '119021-2, г Москва, ул Льва Толстого, д 16;;; 117312-2, г Москва, ул Вавилова, д 19' from dual
)
select id, regexp_substr(str, '(.*?)(;+ |$)', 1, level, NULL, 1) addr_fixed
from tbl
connect by regexp_substr(str, '(.*?)(;+ |$)', 1, level, NULL, 1) is not null
and prior id = id
and prior sys_guid() is not null;
ID ADDR_FIXED
---------- ---------------------------------------------
1 119021-1, ¿ ¿¿¿¿¿¿, ¿¿ ¿¿¿¿ ¿¿¿¿¿¿¿¿, ¿ 16
1 117312-1, ¿ ¿¿¿¿¿¿, ¿¿ ¿¿¿¿¿¿¿¿, ¿ 19
2 119021-2, ¿ ¿¿¿¿¿¿, ¿¿ ¿¿¿¿ ¿¿¿¿¿¿¿¿, ¿ 16
2 117312-2, ¿ ¿¿¿¿¿¿, ¿¿ ¿¿¿¿¿¿¿¿, ¿ 19
4 rows selected.