Мне нравится ответ "без лошади". Но вот еще один метод, использующий регулярные выражения:
select regexp_replace(str, '^([^~]*[~]){3}$', '')
from (values ('1~2~3~4~5~6~7~8'), ('7~8~22~99~1')) v(str);
Или regexp_matches()
:
select str, (regexp_matches(str, '^([^~]*[~]){3}(.*)$'))[2] as retval
from (values ('1~2~3~4~5~6~7~8'), ('7~8~22~99~1'), ('1~2')) v(str)
Здесь - это db <> скрипка.