BigQuery 返回所有匹配的正则表达式

d-_*_*_-b 0 sql re2 google-bigquery

在 Big Query 中,当我进行正则表达式搜索时,它只返回第一个匹配/出现。

有没有办法返回所有匹配项,串联?像GROUP_CONCAT也许吗?

REGEXP_EXTRACT(body, r"(\w+ )")

Mik*_*ant 7

在 BigQuery 支持的最近引入的标准 SQL 中 - 您可以尝试如下

SELECT 
  body,
  (SELECT STRING_AGG(word) FROM words.word) AS words
FROM (
  SELECT 
    body, REGEXP_EXTRACT_ALL(body, r'(\w+)') AS word
  FROM (
    SELECT 'abc xyz qwerty asd' AS body UNION ALL
    SELECT 'zxc dfg 345' AS body
  )
) words
Run Code Online (Sandbox Code Playgroud)

不要忘记取消Use Legacy SQL选中Show Options
查看有关REGEXP_EXTRACT_ALLSTRING_AGG 的更多详细信息下的复选框


如果您对 BigQuery 中现在称为旧 SQL 的内容感到困惑 - 您可以尝试以下操作

SELECT 
  body, 
  GROUP_CONCAT(SPLIT(body, ' ')) AS words
FROM 
  (SELECT 'abc xyz qwerty asd' AS body),
  (SELECT 'zxc dfg 345' AS body)
Run Code Online (Sandbox Code Playgroud)

我明白,这不一定正是您所需要的 - 但可能会有所帮助


BigQuery 旧 SQL 的另一种方法更适合您必须使用正则表达式的情况。
例如 - 假设您只需要从 body 中提取数字想法是使用REGEXP_REPLACE从 body 中提取任何数字,然后应用上述SPLIT() + GROUP_CONCAT()

SELECT 
  body, 
  GROUP_CONCAT(SPLIT(REGEXP_REPLACE(body, r'(\D)+', ':'), ':')) AS words
FROM 
  (SELECT 'abc 123 xyz 543 qwerty asd' AS body),
  (SELECT '987zxc 123 dfg 345' AS body)
Run Code Online (Sandbox Code Playgroud)