Вот еще один способ:
with tbl(objectid, linkvalue) as (
select 1, '1V 2E 3T/B' from dual union all
select 2, '3C+1E. 3V' from dual union all
select 3, '5V.4PH' from dual
)
select objectid,
regexp_substr(linkvalue, '(.*?)([ +.]+|$)', 1, level, NULL, 1)
from tbl
connect by level <= regexp_count(linkvalue, '[ +.]+') + 1
and prior objectid = objectid
and prior sys_guid() is not null;
OBJECTID REGEXP_SUBSTR(LINKVALUE,'(.*?)([ +.]+|$)',1,LEVEL,NULL,1)
-------- ----------------------------------------------------------
1 1V
1 2E
1 3T/B
2 3C
2 1E
2 3V
3 5V
3 4PH
Редактировать: добавлен случай, когда нет разделителя. Сделайте пропуск, чтобы добавить пробел между заглавной буквой и цифрой. Конечно, это довольно быстро и грязно, но я не скажу, если вы не будете.
Edit2: допускается для значения, состоящего из нескольких отдельных заглавных букв, разделенных 1 или более разделителями. Однако регулярное выражение становится ужасным.
-- Set up data set
with tbl(objectid, linkvalue) as (
select 1, '1V 2E 3T/B' from dual union all
select 2, '3C+1E. 3V' from dual union all
select 3, '5V.4PH' from dual union all
select 4, '4H6C' from dual union all
select 5, 'C E O 8V' from dual union all
select 6, 'V H' from dual union all
select 7, '9X X Y Z' from dual
),
-- Add a delimiter where missing
tbl1(objectid, linkvalue) as (
select objectid,
regexp_replace(linkvalue, '([A-Z])([0-9])', '\1 \2')
from tbl
)
select objectid,
regexp_substr(linkvalue, '(([A-Z][ +.]?)+|.*?)([ +.]+|$)', 1, level, NULL, 1)
from tbl1
connect by regexp_substr(linkvalue, '(([A-Z][ +.]?)+|.*?)([ +.]+|$)', 1, level) is not null
and prior objectid = objectid
and prior sys_guid() is not null;