BigQuery中如何对两列字符串值进行正则比较
实现方法
逐行校验同表两列的子串包含关系,分两种常见场景处理:
场景1:纯文本子串校验(绝大多数业务需求选这个)
如果只是判断ColA的原始字符串是否为ResultCol的连续子串,不需要做正则规则匹配,不建议用REGEXP_CONTAINS,直接用STRPOS函数即可,性能更高,也不需要额外处理正则特殊字符的转义问题,写法:
SELECT * FROM 你的目标表 -- STRPOS返回子串在目标串中的起始位置,返回值大于0即代表子串存在 WHERE STRPOS(ResultCol, ColA) > 0;
补充判定规则:
- 该判断默认大小写敏感,需要忽略大小写的话,给两列统一套上大小写转换函数即可:
WHERE STRPOS(LOWER(ResultCol), LOWER(ColA)) > 0 - 如果你的业务规则中空字符串不算有效子串,追加条件
AND ColA != ''即可,默认逻辑中空串会被判定为任意字符串的子串。
场景2:需要将ColA作为正则规则匹配ResultCol
如果ColA列存储的内容本身就是正则表达式,需要用这套规则匹配ResultCol的内容,直接把列名作为REGEXP_CONTAINS的第二个参数传入即可,不需要额外做字符串拼接:
SELECT * FROM 你的目标表 WHERE REGEXP_CONTAINS(ResultCol, ColA);
注意事项:
- 参数顺序不要写反:第一个参数是待匹配的目标字符串(即ResultCol),第二个参数是正则规则(即ColA),写反会变成判断ResultCol是否为ColA的子串。
- 如果ColA中存储的是普通文本而非正则,不要用这个写法:正则元字符(比如
.、*、+、?、|、()等)会被当成正则语法解析,导致匹配结果不符合预期,这种情况请使用场景1的STRPOS写法。
内容的提问来源于stack exchange,提问作者jokol
相关产品推荐
相关产品推荐

