#google-bigquery
#google-bigquery
Вопрос:
У меня есть образец данных в виде
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 до последнего
/
- заголовок — все, что после последнего
/
в строке.
Есть случаи, когда /
ее вообще нет (запись # 3). В этом случае я хочу, чтобы все 3 части были равны исходной строке.
Например, для string as /premier-league/transfers/
я бы хотел, чтобы мой вывод был —
category = "premier-league" , path = "premier-league/transfers/" , title = ""
Мой текущий код выдает мне результаты в виде
Принимая во внимание, что мне нужно —
Ответ №1:
Без особого рефакторинга и оставляя всю вашу исходную логику нетронутой — просто внесите следующие изменения для category_and_titles
CTE
...
, category_and_titles AS (
SELECT *,
SPLIT(new_pagename, "/")[OFFSET(0)] AS page_category,
IF(REGEXP_CONTAINS(new_pagename, r'/'), REGEXP_REPLACE(new_pagename, r'[^/] $', ""), new_pagename) AS path,
IF(REGEXP_CONTAINS(new_pagename, r'/'), COALESCE(REGEXP_EXTRACT(new_pagename, r'/([^/] )?$'), "no-title"), new_pagename) AS title
FROM dated_content
)
...
с этим незначительным изменением результат будет таким, как ожидалось