在BigQuery中提取字符串:从Body字段提取18位日期序列
问题描述
我的BigQuery xyz表中有一个Body字段,存储着内部应用的扫描请求记录,示例数据如下:
| Body |
|---|
| /tpt/TpScaning-ScaningRoad-PERSIVEE-202301020730327429-1567651.tp |
| /tpt/TpScaning-BaliResortsInterns-PERSIVEE-202205300341154744-909890.tp |
| /tpt/TpScaning-RXX-PERSIVEE-202108210412090110-000989.tp |
| /tpt/TpScaning-Backnationnotecom-PERSIVEE-202112201229124214-783672.tp |
| /tpt/TpScaning-DBZ-PERSIVEE-202109131129036172-908954.tp |
| /tpt/TpScaning-DBZ-PERSIVEE-202109131129036172-17892578.tp |
该字段包含一段18位数字的日期序列(如202301020730327429、202205300341154744等),我希望把这段序列提取到名为date的独立列中,以此获取扫描请求的创建时间。
我试过用substr函数,但因为Body字段长度不固定,没法正确提取,请问有没有更合适的实现方法?
预期输出:
| date |
|---|
| 202301020730327429 |
| 202205300341154744 |
| 202108210412090110 |
| 202112201229124214 |
| 202109131129036172 |
| 202109131129036172 |
解决方案
针对这种固定格式的18位数字提取,推荐使用BigQuery的正则表达式函数REGEXP_EXTRACT,它可以精准匹配目标内容,不受字段长度变化影响。
基础实现SQL
SELECT REGEXP_EXTRACT(Body, r'(\d{18})') AS date FROM `your-project.xyz`
精准匹配版(适配示例格式)
如果你的Body字段中,目标18位数字始终被-包裹(如示例中位于PERSIVEE-和-数字.tp之间),可以用更精确的正则避免误匹配:
SELECT REGEXP_EXTRACT(Body, r'-(\d{18})-') AS date FROM `your-project.xyz`
说明
REGEXP_EXTRACT会从Body字段中提取第一个符合正则规则的内容- 正则
r'(\d{18})'表示匹配连续18位数字,直接定位目标序列 - 精准版正则
r'-(\d{18})-'限定了数字的前后分隔符,进一步提升匹配准确性
内容的提问来源于stack exchange,提问作者Kushal
相关产品推荐
相关产品推荐

