试试这个:
在 postgres 中
with cte as (
select 'https://google.com/?utm_medium=cpc&utm_source=google&utm_campaign=c_lp_generic_us_2021-03-23&gclid=Cj0KCQjwkZiFBhD9ARIsAGxFX8AienwPdwPa_-qZnqbRzFoK98BU3VvTvdI4La5IrPW7anUaBOX5QSQaAs01EALw_wcB' url_
)
select
split_part(url_,'?',1),
max(split_part(t.split_,'=',2)) filter(where split_part(t.split_,'=',1)='utm_medium') "utm_medium",
max(split_part(t.split_,'=',2)) filter(where split_part(t.split_,'=',1)='utm_source') "utm_source",
max(split_part(t.split_,'=',2)) filter(where split_part(t.split_,'=',1)='utm_campaign') "utm_campaign"
from cte cross join lateral
regexp_split_to_table(split_part(url_,'?',2),'&') t(split_)
group by 1
根据评论编辑:
在postgresql 和redshift 两者中
with cte as (
select 'https://google.com/?utm_medium=cpc&utm_source=google&utm_campaign=c_lp_generic_us_2021-03-23&gclid=Cj0KCQjwkZiFBhD9ARIsAGxFX8AienwPdwPa_-qZnqbRzFoK98BU3VvTvdI4La5IrPW7anUaBOX5QSQaAs01EALw_wcB' url_
)
select
split_part(url_,'?',1),
substring(split_part(url_,'utm_medium=',2),1,position('&' in split_part(url_,'utm_medium=',2))-1) "utm_medium",
substring(split_part(url_,'utm_source=',2),1,position('&' in split_part(url_,'utm_source=',2))-1) "utm_source",
substring(split_part(url_,'utm_campaign=',2),1,position('&' in split_part(url_,'utm_campaign=',2))-1) "utm_campaign"
from cte
DEMO