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

Posted

技术标签:

【中文标题】如何在 BigQuery 中使用 REGEXP_EXTRACT 仅提取数值?【英文标题】:How to extract just numeric value with REGEXP_EXTRACT in BigQuery? 【发布时间】:2020-03-05 09:03:36 【问题描述】:

我正在尝试仅从 BigQuery 中的特定列中提取数字。 相关字段的格式如下: value = "Livraison_21J|Relais_19J" 或 "RELAIS_15 DAY" 我正在尝试提取关键字“Relais”前面的每个值的天数。 天数范围从 1 到 100。

我是这样做的:

SELECT CAST(REGEXP_EXTRACT(delivery, r"RELAIS_([0-9]+J)") as string) as relayDay
FROM TABLE

我希望能够只提取天数,而不管数字后面的字符串是“J”还是“DAY”。

样本数据:

RETRAIT_2H|LIVRAISON_5J|RELAIS_5J    |     5J

LIVRAISON_21J|RELAIS_19J             |     19J

LIVRAISON_21J|RELAIS_19J             |     19J

RETRAIT_2H|LIVRAISON_3J|RELAIS_3J    |     3J

【问题讨论】:

请提供应匹配的样本数据 和第一个数字一样,你的意思是19吗?第二个数字 > 15 后面没有大写 J。这意味着你的模式是错误的。 试试SPLIT(REGEXP_REPLACE(delivery, r'[^0-9|]+',''), '|') 添加样本数据 样本数据中的| 是什么意思?预期结果?所以你想要一个值,在最后一个 JDAY 之前?那就试试REGEXP_EXTRACT(delivery, r"(?:.*\D)?(\d+)\s*(?:J|DAY)") 【参考方案1】:

你可以使用

REGEXP_EXTRACT(delivery, r"(?:.*\D)?(\d+)\s*(?:J|DAY)")

见regex demo

详情

(?:.*\D)? - 一个可选的非捕获组,它尽可能多地匹配除换行符 chsrs 之外的 0+ 个字符,然后是一个非数字字符(此模式需要将索引推进到最后一个数字序列之前的位置,而不是最后一个数字) (\d+) - 第 1 组(正是 REGEXP_EXTRACT 返回的内容):一位或多位数字 \s* - 0+ 个空格 (?:J|DAY) - JDAY 子字符串。

【讨论】:

以上是关于如何在 BigQuery 中使用 REGEXP_EXTRACT 仅提取数值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Datalab 的 api 中使用 Bigquery 中的子查询?

如何使用 API 在 BigQuery 中获取临时表的名称

在 Google 表格中使用 BigQuery,如何授予其他用户按“刷新”的权限?

如何在 BigQuery 中使用 UDF 展平 Google Analytics 自定义维度?

如何安全地为 bigquery 节点插入转义用户输入?可以在 bigquery.insert 节点库上使用参数化查询吗?

如何使用python修复在bigquery中上传csv文件