Если возможно, лучшим решением было бы изменить ваши данные таким образом, чтобы каждое значение сохранялось в отдельной строке.
Если это не сработает, вы можете создать функцию PL / SQL.
Если вам нужно решение исключительно на основе SQL, обычно вам нужно разделить каждое значение на несколько строк (перекрестное объединение с таблицей объектов или соединение по уровню <= максимальное количество элементов), а затем повторно объединитьданные, используя один из дюжины различных методов (listagg, collect, stragg, xml, sys_connect_by_path и т. д.) </p>
Еще один способ только для SQL - использовать регулярные выражения.Это, вероятно, самый быстрый, но он работает только с 9 элементами, потому что Oracle поддерживает только 9 обратных ссылок:
--Get everything except the extra ':' at the end.
select substr(string, 1, length(string) - 1) string from
(
select regexp_replace(
--Add a delimter to the end so all items are the same
'L3:L2:L1:L0'||':'
--Non-greedy search for anything up to a : (I bet there's a better way to do this)
,'(.*?:)?(.*?:)?(.*?:)?(.*?:)?(.*?:)?(.*?:)?(.*?:)?(.*?:)?(.*?:)?(.*?:)?'
--Reverse the back-references
,'\9\8\7\6\5\4\3\2\1') string
from dual
);