BigQuery中使用LIKE匹配多模式(含动态模式)的实现方法
BigQuery多模式LIKE匹配的简化实现
一、直接用数组简化写法
BigQuery不支持LIKE IN语法,但可以通过正则表达式实现等价的简洁写法:
方式1:使用REGEXP_CONTAINS结合数组转正则
SELECT description FROM mytable WHERE REGEXP_CONTAINS(mycol, ARRAY_TO_STRING(["window", "door", "carpet"], "|"))
ARRAY_TO_STRING会将数组元素用|拼接成正则表达式(window|door|carpet),REGEXP_CONTAINS会检查mycol是否包含任意一个目标子串,效果和多个OR LIKE完全一致。
方式2:使用REGEXP_UNION函数(BigQuery 2023+版本支持)
如果你的BigQuery版本支持该函数,写法更直观,还能自动处理正则特殊字符转义:
SELECT description FROM mytable WHERE REGEXP_CONTAINS(mycol, REGEXP_UNION(["window", "door", "carpet"]))
二、模式存储在另一张表的动态实现
如果匹配模式是动态生成并存储在另一张表(示例表名为pattern_table,含pattern字段),推荐两种最优实现:
方式1:用EXISTS关联检查(最安全,无正则转义风险)
这种方式完全贴合原始LIKE逻辑,无需处理正则特殊字符(比如模式含.、*时不会出错):
SELECT t.description FROM mytable t WHERE EXISTS ( SELECT 1 FROM `your-project.your-dataset.pattern_table` p WHERE t.mycol LIKE CONCAT("%", p.pattern, "%") )
方式2:预生成正则表达式(性能更优,适合大量模式)
如果模式数量较多,先合并所有模式为一个正则表达式,再做单次匹配,性能更高效:
WITH aggregated_patterns AS ( SELECT ARRAY_TO_STRING(ARRAY_AGG(pattern), "|") AS regex_pattern FROM `your-project.your-dataset.pattern_table` ) SELECT t.description FROM mytable t CROSS JOIN aggregated_patterns p WHERE REGEXP_CONTAINS(t.mycol, p.regex_pattern)
若模式中包含+、?这类正则特殊字符,可添加REGEXP_ESCAPE转义:
WITH aggregated_patterns AS ( SELECT ARRAY_TO_STRING(ARRAY_AGG(REGEXP_ESCAPE(pattern)), "|") AS regex_pattern FROM `your-project.your-dataset.pattern_table` ) SELECT t.description FROM mytable t CROSS JOIN aggregated_patterns p WHERE REGEXP_CONTAINS(t.mycol, p.regex_pattern)
内容的提问来源于stack exchange,提问作者Galuoises
相关产品推荐
相关产品推荐

