Попробуйте использовать регулярные выражения ... теперь у вас есть две проблемы:
select
cola,
regexp_replace(cola, '([^*|]*)\|([^*|]*)(\*|$)','\2|\1\3') as swapped_col
from (
select '3456|Abc*7890|Def*9430|Ghi*3534|Jkl' cola from dual
)
По сути, регулярное выражение говорит, что ищите все, что не является |или *, пока не найдете |, затем найдите все, что не является |или * пока вы не найдете * или затем конец строки.Затем поменяйте местами два бита и завершите его символом, который вы нашли в качестве конечного разделителя (* или EOL).Поменяемые биты сгруппированы по круглым скобкам, затем в строке замены цифры обозначают, где ... так что сначала помещается содержимое второго набора скобок, затем вертикальная черта, затем первый набор скобок, затем третий.
По умолчанию REGEXP_REPLACE заменяет все вхождения, которые он находит в шаблоне, и заменяет его