如何在 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|]+',''), '|')
添加样本数据
样本数据中的|
是什么意思?预期结果?所以你想要一个值,在最后一个 J
或 DAY
之前?那就试试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)
- J
或 DAY
子字符串。
【讨论】:
以上是关于如何在 BigQuery 中使用 REGEXP_EXTRACT 仅提取数值?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Datalab 的 api 中使用 Bigquery 中的子查询?
在 Google 表格中使用 BigQuery,如何授予其他用户按“刷新”的权限?
如何在 BigQuery 中使用 UDF 展平 Google Analytics 自定义维度?
如何安全地为 bigquery 节点插入转义用户输入?可以在 bigquery.insert 节点库上使用参数化查询吗?