BigQuery - 将正则表达式与 LIKE 运算符 (?) 结合使用

Posted

技术标签:

【中文标题】BigQuery - 将正则表达式与 LIKE 运算符 (?) 结合使用【英文标题】:BigQuery - Using regexp with LIKE operator (?) 【发布时间】:2021-07-15 10:06:41 【问题描述】:

我想从 url 获取 productids,我几乎已经微调了一个查询来做到这一点,但仍然有一个我无法解决的问题。 网址通常如下所示:

/xp-pen/toll-spe43-deco-pro-small-medium-spe43-tobuy-p665088831/

/harry-potter-es-a-tuz-serlege-2019-m19247107/

如您所见,有两种类型的 id:

一般来说,id 以“-p”开头 一些特殊产品的id以'-m'开头

我在声明时创建了这个案例:

CASE
   WHEN MAX(hits.page.pagePath) LIKE '%-p%' 
     THEN MAX(REGEXP_REPLACE(REGEXP_EXTRACT(                
       hits.page.pagePath, '-p[0-9]+/'), '\\-|p|/', ''))                                
   WHEN MAX(hits.page.pagePath) LIKE '%-m%' 
     THEN MAX(REGEXP_REPLACE(REGEXP_EXTRACT(                
       hits.page.pagePath, '-m[0-9]+/'), '\\-|m|/', ''))
   ELSE NULL            
END AS productId

乍一看有点复杂,但我真的需要一个 regexp_replace 和一个 regexp_extract 因为“-p”或“-m”字符不仅出现在 id 之前,而且可以在 url 中乘以。

我的代码的问题是,当 url 看起来像这样时,有一些特殊情况:

/elveszett-profeciak-2019-m17855487/

如您所见,id 以“-m”开头,但 url 也包含“-p”。在这种情况下,查询中的结果是空值。 我认为可以通过在 case when 语句的 when 部分修改 like 运算符来解决:LIKE '%-p%'LIKE '%-m%' 在 LIKE 运算符之后或代替 LIKE 运算符后有一个正则表达式表达式会很棒。类似于我在 regexp_extract 函数中使用的 '-p[0-9]+/' 的参数。

所以我需要在语句的 when 部分定义如果 '-p' 或 '-m' 文本后跟 url 中的数字

我不确定在 BQ 中是否可以这样做。

【问题讨论】:

【参考方案1】:

所以我需要在语句的 when 部分定义如果 '-p' 或 '-m' 文本后跟 url 中的数字

我想你想要 '-p''-m' 后跟数字。如果是这样,我认为这可以满足您的要求:

select regexp_extract(url, '-[pm][0-9]+')
from (select '/xp-pen/toll-spe43-deco-pro-small-medium-spe43-tobuy-p665088831/' as url union all 
      select '/elveszett-profeciak-2019-m17855487/' union all
      select '/harry-potter-es-a-tuz-serlege-2019-m19247107/'
     ) x

【讨论】:

非常感谢!我改用了 regexp_contains 但你描述的 regexp 参数非常有用

以上是关于BigQuery - 将正则表达式与 LIKE 运算符 (?) 结合使用的主要内容,如果未能解决你的问题,请参考以下文章

正则 及 oracle 判断字段是否为是数字 regexp_like用法 正则表达式

oracle 判断字段是否为是数字 regexp like用法 正则表达式

oracle 判断字段是否为是数字等 regexp_like用法 正则表达式

MySQL中的Like和正则表达

Oracle正则表达式-初级使用

Oracle正则表达式-初级使用