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

如何找出BigQuery中可用作通配符的表前缀?

可行的BigQuery动态表前缀提取方法

以下是几种无需依赖外部工具、仅通过BigQuery SQL即可提取动态表前缀的方案,适配只读权限场景:

方法1:正则匹配提取带数字后缀的前缀

针对「前缀+数字串」的动态表命名规则(如events_122022),用正则直接提取前缀部分,再筛选出对应多个表的有效前缀:

WITH table_prefixes AS (
  SELECT
    -- 匹配最后下划线后的数字序列,提取下划线前的前缀
    REGEXP_EXTRACT(table_name, r'^(.*?)_\d+$') AS prefix
  FROM
    dataset.INFORMATION_SCHEMA.TABLES
  WHERE
    -- 仅保留符合「前缀_数字」格式的表
    REGEXP_CONTAINS(table_name, r'^.*_\d+$')
)
SELECT DISTINCT prefix
FROM table_prefixes
WHERE prefix IS NOT NULL
-- 可选:仅保留对应多个表的前缀,排除单个表的孤立情况
AND (SELECT COUNT(*) FROM table_prefixes tp WHERE tp.prefix = table_prefixes.prefix) > 1;

方法2:结合DDL分组+SQL内置最长公共前缀计算

延续你之前按DDL分组的思路,直接在SQL内对每组表名计算最长公共前缀,无需外部算法工具:

WITH grouped_tables AS (
  SELECT
    SUBSTR(ddl, STRPOS(ddl, '(')) AS common_ddl,
    ARRAY_AGG(table_name) AS table_names
  FROM
    dataset.INFORMATION_SCHEMA.TABLES
  GROUP BY SUBSTR(ddl, STRPOS(ddl, '('))
),
prefix_calculations AS (
  SELECT
    common_ddl,
    -- 递归比对字符,计算组内表名的最长公共前缀
    (SELECT 
       STRING_AGG(SUBSTR(tn, 1, pos), '') 
       FROM (
         SELECT
           tn,
           MIN(pos) OVER() AS pos
         FROM UNNEST(table_names) tn,
              UNNEST(GENERATE_ARRAY(1, LENGTH(MIN(tn) OVER()))) pos
         WHERE ALL(SUBSTR(tn, 1, pos) = SUBSTR(MIN(tn) OVER(), 1, pos))
       )
       GROUP BY pos
       LIMIT 1
    ) AS longest_common_prefix
  FROM grouped_tables
  WHERE ARRAY_LENGTH(table_names) > 1
)
SELECT DISTINCT longest_common_prefix
FROM prefix_calculations
WHERE longest_common_prefix LIKE '%_'; -- 筛选以_结尾的前缀,匹配你的需求格式

方法3:字符位置逐步比对法

从表名的第一个字符开始,逐步增加比对长度,找到所有表名的最长公共前缀:

WITH table_list AS (
  SELECT table_name FROM dataset.INFORMATION_SCHEMA.TABLES
),
max_check_length AS (
  SELECT MIN(LENGTH(table_name)) AS min_table_len FROM table_list
),
prefix_validation AS (
  SELECT
    pos,
    SUBSTR(table_name, 1, pos) AS prefix
  FROM table_list, max_check_length, GENERATE_ARRAY(1, min_table_len) pos
  GROUP BY pos, prefix
  HAVING COUNT(*) = (SELECT COUNT(*) FROM table_list WHERE SUBSTR(table_name,1,pos) = prefix)
),
longest_valid_prefix AS (
  SELECT prefix FROM prefix_validation ORDER BY pos DESC LIMIT 1
)
SELECT prefix FROM longest_valid_prefix
WHERE prefix LIKE '%_'; -- 确保前缀以_结尾,符合动态表命名特征

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 07:36:33