Presto中如何简洁实现多字段与多个子串的匹配判断?
Presto 实现多字段匹配任意子串的简洁写法
你可以通过Presto内置的数组函数消除重复判断逻辑,不需要逐字段编写重复的匹配规则,最终实现效果和你期望的伪代码逻辑完全一致。
方案1:正则匹配版本(代码最简洁)
把所有待校验字段打包为数组,通过any_match函数判断数组中是否存在任意字段命中目标子串的正则规则即可:
SELECT * FROM your_table WHERE any_match( -- 所有待校验字段放在这个数组里,增删字段只需要改这一处 ARRAY[column1, column2, column3], col -> col IS NOT NULL AND REGEXP_LIKE(col, 'test|inactive|deprecated') )
- 新增待匹配子串时,只需要在正则的
|分隔符后追加内容即可,不需要给每个字段重复加判断 - 新增待校验字段时,只需要往数组里追加字段名即可
- 加
col IS NOT NULL是为了避免字段空值导致匹配结果不符合预期,如果确定字段无空值可以省略
方案2:原生LIKE版本(无正则转义负担)
如果待匹配的子串中包含.、*、?等正则特殊字符,不想额外做转义处理,可以用双层any_match分别包裹字段列表和匹配模式列表,完全用原生LIKE逻辑实现,和你最开始写的多OR逻辑完全等价:
SELECT * FROM your_table WHERE any_match( -- 待校验字段列表 ARRAY[column1, column2, column3], col -> col IS NOT NULL AND any_match( -- 待匹配子串模式,前后加%就是包含匹配 ARRAY['%test%', '%inactive%', '%deprecated%'], pattern -> col LIKE pattern ) )
这个写法的维护成本和正则版本一致,字段、子串的增删都只需要修改对应数组,没有重复代码。
注意事项
如果待校验字段不是字符串类型(比如数值、日期、时间戳),需要先通过CAST(字段 AS VARCHAR)转为字符串后再做匹配,否则会抛出类型不兼容的错误。
内容的提问来源于stack exchange,提问作者Stevoisiak
相关产品推荐
相关产品推荐

