Если ваши имена всегда в одном и том же формате, т.е. AAA-999-AAA
, это довольно просто, просто набрав substr()
вызовов:
select substr(fn.name, 1, 4)
|| substr(fse.name, 5, 3)
|| substr(fn.name, 8) as new_name
from fn
join fse on fn.id = fse.id
/
Однако, если форматы имен могут различаться - скажем, AAAA-99-AAAAA
действительный - тогда мы не можем использовать фиксированные смещения.Таким образом, код становится все более сложным, с instr()
вызовами для определения позиции каждого тире:
select substr(fn.name, 1, instr(fn.name, '-', 1, 1))
|| substr(fse.name, instr(fse.name, '-', 1, 1)+1, instr(fse.name, '-', 1, 2) - instr(fse.name, '-', 1, 1)-1 )
|| substr(fn.name, instr(fn.name, '-', 1, 2)) as new_name
from fn
join fse on fn.id = fse.id
/
Нет сомнений, что есть необычное решение с использованием регулярных выражений, но я предпочитаю избегать регулярных выражений для задач, которые могут бытьсделано с substr()
и instr()
по соображениям производительности.