Звучит так, будто вы пытаетесь выполнить подстроку от «первого» abc_ »до« первого »&, за которым не следует« abc_ ». Для начальной части будет работать обычный INSTR
;для конечного условия вам понадобится регулярное выражение.
set scan off
-- example data
with x as (select 'abc_s=facebook&abc_m=social&abc_c=abcd-video&clicks=jfhjkfdjfdjkfh' as s from dual
union select 'abc_s=facebook&abc_m=social&gmpc_c=abcd-ideo&clicks=jfhjkfdjfdjkfh' from dual
union select 'www.google.com/search?abc_source=blah&abc_medium=blahblah&abc_campaign=blahblah' from dual)
-- query
SELECT SUBSTR(s,
INSTR(s, 'abc_'), -- start with the first 'abc_'
regexp_instr(s, '(&[^a][^b][^c][^_])|$')-1 -- end with the first & that isn't followed by "abc_"; or the end
) AS OUTPUT_STR
FROM x;
Вывод:
abc_s=facebook&abc_m=social&abc_c=abcd-video
abc_s=facebook&abc_m=social
abc_source=blah&abc_medium=blahblah&abc_campaign=blahblah
В качестве примечания, если вы пытаетесь разделить разделенный '&' разделенныйзначений в список, попробуйте посмотреть на один из вопросов о разбиении значений через запятую , но используйте & вместо запятой.