使用 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 从列中提取字符串