如何在SQL查询中标记返回行匹配的正则表达式
在BigQuery单查询中标记匹配的正则规则
针对你的需求,有两种实用的实现方式,都能在单次查询里完成过滤和标记:
方式一:返回所有匹配的规则(支持一行匹配多个正则)
把所有正则规则整理成带标识的数组,通过关联匹配后聚合结果,能得到每行所有匹配的规则ID:
WITH regex_rules AS ( SELECT * FROM UNNEST([ STRUCT('expression_1' AS rule_id, r"[a-z0-9A-Z]{40}" AS pattern), STRUCT('expression_2' AS rule_id, r"[0-9a-z]{32}" AS pattern), -- 继续添加你的其他规则,比如 STRUCT('expression_n-1' AS rule_id, r"[a-z0-9]{80}" AS pattern), STRUCT('expression_n' AS rule_id, r"[a-z0-9A-Z\%]{35}" AS pattern) ]) ) SELECT t.*, STRING_AGG(r.rule_id, ', ') AS matched_rules FROM Sample_Table t JOIN regex_rules r ON REGEXP_CONTAINS(t.content, r.pattern) GROUP BY t.* -- BigQuery支持按所有字段直接分组 ORDER BY t.some_column; -- 替换成你需要排序的字段
这个方法会把每行匹配的所有规则用逗号拼接起来,比如某行同时匹配expression_1和expression_2,matched_rules就会显示expression_1, expression_2。
方式二:返回第一个匹配的规则(按优先级标记)
如果只需要知道每行匹配的第一个规则(按你定义的顺序),可以用CASE WHEN链式判断,效率更高:
SELECT *, CASE WHEN REGEXP_CONTAINS(content, r"[a-z0-9A-Z]{40}") THEN 'expression_1' WHEN REGEXP_CONTAINS(content, r"[0-9a-z]{32}") THEN 'expression_2' -- 依次添加后续规则 WHEN REGEXP_CONTAINS(content, r"[a-z0-9]{80}") THEN 'expression_n-1' WHEN REGEXP_CONTAINS(content, r"[a-z0-9A-Z\%]{35}") THEN 'expression_n' END AS matched_rule FROM Sample_Table WHERE REGEXP_CONTAINS(content, r"[a-z0-9A-Z]{40}") OR REGEXP_CONTAINS(content, r"[0-9a-z]{32}") OR REGEXP_CONTAINS(content, r"[a-z0-9]{80}") OR REGEXP_CONTAINS(content, r"[a-z0-9A-Z\%]{35}")
注意:CASE WHEN是按顺序判断的,只要第一个匹配的条件满足,就会返回对应的规则ID,后面的条件不会再执行。如果想简化WHERE条件,可以把所有正则用|拼接成一个大的正则表达式,避免重复写判断条件。
内容的提问来源于stack exchange,提问作者Setu Kumar Basak
相关产品推荐
相关产品推荐

