使用 REGEXP_EXTRACT 提取 7 位数字

Posted

技术标签:

【中文标题】使用 REGEXP_EXTRACT 提取 7 位数字【英文标题】:Using REGEXP_EXTRACT extract 7 digit numbers 【发布时间】:2017-11-15 14:22:06 【问题描述】:

我有一个要求。我想从其中一列中提取 7 位数字,并使用另一个表查找每个 7 位数字的另一列,并与“|”连接。

列数据:在此需要提取7位数字。 ";2435034;1;5.98;;eVar36=bopis|ev2=2605,;1483528;1;17.97;;ev6=bopis|evar52=2605,;1010203;1;7.98;;ev6=bopis|ev2=2605"

输出(提取 7 位数字):

 2435034,1483528,1010203 

另一个表:

account name
2435034 D1
1483528 D2
1010203 D3

最终输出是(加入另一个表后):

     account_nbr        account_name
2435034|1483528|1010203  D1|D2|D3

我尝试使用以下命令提取 7 位数字。我只得到第一个号码,其余号码没有来。

REGEXP_EXTRACT(REGEXP_REPLACE(";2435034;1;5.98;;eVar36=bopis|ev2=2605,;1483528;1;17.97;;ev6=bopis|evar52=2605,;1010203;1;7.98;;ev6=bopis|ev2=2605", r'[^\d]+', ','),r'[0-9]+')

这可能很简单,但无法弄清楚。尝试使用 GROUP_CONCAT 和 SPLIT 函数也出现以下错误。

Exactly one capturing group must be specified

如果您有任何建议,请告诉我。

提前致谢。

【问题讨论】:

尝试将r'[0-9]+' 替换为r'([0-9]+)'。另外r'[^\d]+'可以写成r'\D+' 您可能需要改用标准 SQL 来使用 REGEXP_EXTRACT_ALL。 【参考方案1】:

以下是 BigQuery 标准 SQL

#standardSQL
SELECT 
  STRING_AGG(nbr, '|' ORDER BY pos) account_nbr,
  STRING_AGG(name, '|' ORDER BY pos) account_name,  
  data
FROM `project.dataset.yourTable` t, 
UNNEST(REGEXP_EXTRACT_ALL(REGEXP_REPLACE(t.data, r'[^\d]+', ','),r'[0-9]7')) nbr WITH OFFSET pos
JOIN `project.dataset.anotherTable` x
ON CAST(x.account AS STRING) = nbr
GROUP BY data

您可以使用问题中的虚拟数据来测试/玩它:

#standardSQL
WITH `project.dataset.yourTable` AS (
  SELECT ";2435034;1;5.98;;eVar36=bopis|ev2=2605,;1483528;1;17.97;;ev6=bopis|evar52=2605,;1010203;1;7.98;;ev6=bopis|ev2=2605" data
), `project.dataset.anotherTable` AS (
  SELECT 2435034 account, 'D1' name UNION ALL
  SELECT 1483528, 'D2' UNION ALL
  SELECT 1010203, 'D3' 
)
SELECT 
  STRING_AGG(nbr, '|' ORDER BY pos) account_nbr,
  STRING_AGG(name, '|' ORDER BY pos) account_name,  
  data
FROM `project.dataset.yourTable` t, 
UNNEST(REGEXP_EXTRACT_ALL(REGEXP_REPLACE(t.data, r'[^\d]+', ','),r'[0-9]7')) nbr WITH OFFSET pos
JOIN `project.dataset.anotherTable` x
ON CAST(x.account AS STRING) = nbr
GROUP BY data

更新 cmets 中的新问题:如果 t.data 为空,则会过滤记录。有没有办法即使 t.data 为空也可以获得记录?在我的表中,一些记录对 t.data 没有价值

#standardSQL
WITH `project.dataset.yourTable` AS (
  SELECT 1 id, ";2435031;1;5.98;;eVar36=bopis|ev2=2605,;1483528;1;17.97;;ev6=bopis|evar52=2605,;1010203;1;7.98;;ev6=bopis|ev2=2605" data UNION ALL
  SELECT 2, NULL
), `project.dataset.anotherTable` AS (
  SELECT 2435034 account, 'D1' name UNION ALL
  SELECT 1483528, 'D2' UNION ALL
  SELECT 1010203, 'D3' 
)
SELECT 
  id, 
  (SELECT STRING_AGG(nbr, '|' ORDER BY pos) 
    FROM UNNEST(REGEXP_EXTRACT_ALL(
      REGEXP_REPLACE(t.data, r'[^\d]+', ','),r'[0-9]7')) nbr WITH OFFSET pos
    JOIN `project.dataset.anotherTable` x
      ON CAST(x.account AS STRING) = nbr
  ) a_nbr,
  (SELECT STRING_AGG(name, '|' ORDER BY pos) 
    FROM UNNEST(REGEXP_EXTRACT_ALL(
      REGEXP_REPLACE(t.data, r'[^\d]+', ','),r'[0-9]7')) nbr WITH OFFSET pos
    JOIN `project.dataset.anotherTable` x
      ON CAST(x.account AS STRING) = nbr
  ) a_name,
  data
FROM `project.dataset.yourTable` t
GROUP BY id, data

【讨论】:

我在回答时 - 您的问题评论已被删除。希望我的更新仍然对你有用:o)

以上是关于使用 REGEXP_EXTRACT 提取 7 位数字的主要内容,如果未能解决你的问题,请参考以下文章

在 PySpark 中使用 regexp_extract 提取多个单词

如何在 BigQuery 中使用 REGEXP_EXTRACT 仅提取数值?

BigQuery 中的 REGEXP_EXTRACT - 提取整数或带小数的数字

Google BigQuery 使用 regexp_extract 从列中提取字符串

BigQuery REGEXP_EXTRACT from URL - 提取参数值

Hive regexp_extract 从字符串中提取数值