Ваша строка имеет очень специфический формат. Префикс имеет фиксированную длину. Затем следуют три символа, число (предположительно, позиция), а затем еще три символа.
Если это всегда так, вам не нужно какое-либо настоящее сложное оборудование для замены. Вы можете просто использовать строковые операции:
with replacements as (
select 'Thr' as three_letters, 'T' as one_letter union all
select 'Ala' as three_letters, 'A' as one_letter
)
select v.*,
left(mutation, 14) || r1.one_letter || replace(substr(mutation, 18), r2.three_letters, r2.one_letter)
from (values ('NP_006209.2:p.Thr1025Ala')) v(mutation) left join
replacements r1
on r1.three_letters = substr(mutation, 15, 3) left join
replacements r2
on r2.three_letters = right(mutation, 3);
Я бы действительно рекомендовал вам изменить структуру данных, чтобы все значения не были закодированы в одной строке. Поместите результаты в несколько столбцов:
name
from_amino_acid
to_amino_acid
position
На самом деле, я не знаю, что происходит до :
, и важен ли p.
. Вы также можете разделить это на несколько столбцов. Вы можете использовать logi c, чтобы разделить строку:
select split_part(mutation, ':', 1) as name,
substring(split_part(mutation, ':', 2), 3, 3) as from_amino_acid,
(regexp_matches(split_part(mutation, ':', 2), '[0-9]+'))[1] as position,
right(mutation, 3) as to_amino_acid
from (values ('NP_006209.2:p.Thr1025Ala')) v(mutation);
Это упростит ваш SQL и, возможно, ваш анализ.