У меня есть пример данных как
with temp_table as
(
select "/category/sub-category/title-of-the-page" as pagename
union all
select "premier-league/splash"
union all
select "portal"
union all
select "news/1970/01/01/new-billion"
union all
select "/premier-league/transfers/"
union all
select "/premier-league/tfflive"
)
, clean_pagename as
(
select * ,
if (regexp_contains(pagename, "^/+" ) , regexp_extract(pagename, "^/+(.*)/?$") , pagename) as clean_page
from temp_table
)
, dated_content as
(
select *, if (
regexp_contains(clean_page , "/[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]/") ,
regexp_replace(clean_page , "[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]", "dated-content" ),
clean_page
) as new_pagename
from clean_pagename
)
,category_and_titles as
(
select *, split(new_pagename, "/")[offset(0)] as page_category,
coalesce(REGEXP_EXTRACT(new_pagename, r'/([^/]+)?$') , "no-title") as title,
regexp_replace(new_pagename, r'[^/]+$', "") as path
from dated_content
)
select pagename,
page_category ,
path,
title
from category_and_titles
Вот что я делаю - я удаляю первый /
в строке и заменяю дату-содержимое с помощью регулярного выражения.Затем я хотел бы извлечь 3 вещи
- категория - первый раздел строки перед первым
/
- путь - этот компонент строки от 0 до последнего
/
былвстречается - title - все, что находится после последней
/
в строке.
Бывают случаи, когда /
вообще отсутствует (запись № 3).В этом случае я хочу, чтобы все 3 части были равны исходной строке.
Например - для строки как /premier-league/transfers/
, я хотел бы, чтобы мой вывод был -
category = "premier-league" , path = "premier-league/transfers/" , title = ""
Myтекущий код дает мне результаты как
![output](https://i.stack.imgur.com/n0wtq.png)
В то время как мне нужно -
![desired_output](https://i.stack.imgur.com/aVkLe.png)