You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用正则从BigQuery视图定义中提取依赖表并生成表格?

提取视图依赖表并生成表格的正则方案

场景说明

你有多个BigQuery视图,示例视图my_project.my_dataset.my_view的定义如下:

WITH 
  table_data AS (
  SELECT * FROM `all-time-project.dataset_1.table_1`
  UNION ALL
  SELECT * FROM `all-time-project.dataset_2.table_2`)


 SELECT * FROM table_data

从INFORMATION_SCHEMA.VIEWS获取视图定义后,需要生成包含视图名称、依赖表名称的结构化表格。


实现步骤

1. 用正则提取依赖表

针对BigQuery视图的语法特征,我们可以用正则精准捕获SELECT/FROM/JOIN后引用的物理表(排除WITH子句中定义的临时表)。

基础正则表达式

(?:FROM|JOIN)\s`([^`]+)`(?!\sAS)
  • 匹配逻辑:
    • (?:FROM|JOIN)\s:匹配FROM或JOIN关键字后的空格
    • ([^]+)`:捕获反引号包裹的完整表名(包含项目、数据集、表名)
    • (?!\sAS):负向断言,排除WITH子句里的临时表定义(比如table_data AS (...)这类情况)

批量处理示例(Python)

如果需要批量处理从INFORMATION_SCHEMA.VIEWS导出的视图定义,可以用以下代码:

import re

# 从INFORMATION_SCHEMA获取的视图定义文本
view_def = """WITH 
  table_data AS (
  SELECT * FROM `all-time-project.dataset_1.table_1`
  UNION ALL
  SELECT * FROM `all-time-project.dataset_2.table_2`)


 SELECT * FROM table_data"""

# 匹配依赖表
pattern = re.compile(r"(?:FROM|JOIN)\s`([^`]+)`(?!\sAS)", re.IGNORECASE | re.DOTALL)
dependent_tables = pattern.findall(view_def)

# 当前视图名称
view_name = "my_project.my_dataset.my_view"

2. 生成结构化表格

将提取到的视图名和依赖表整理为Markdown表格:

视图名称依赖表名称
my_project.my_dataset.my_viewall-time-project.dataset_1.table_1
my_project.my_dataset.my_viewall-time-project.dataset_2.table_2

扩展适配

如果视图包含更复杂的逻辑(比如嵌套子查询、多JOIN),可以调整正则以覆盖更多场景:

  • 适配子查询中的表:(?:FROM|JOIN)\s*(?:\(\s*)?([^`]+)`(?!\sAS)`
  • 忽略注释中的表引用:可以先预处理去掉注释,再执行匹配

内容的提问来源于stack exchange,提问作者karinayoo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 02:05:10