Redshift中能否用SIMILAR TO替代LIKE实现表关联?
Redshift中用SIMILAR TO替代LIKE关联时报错的解决方案
问题原因
你遇到的报错是因为Redshift不允许在JOIN的ON条件中,将另一个表的列作为SIMILAR TO的模式参数。SIMILAR TO的模式如果是动态的表列值,Redshift的查询执行引擎无法对这类操作进行有效优化,因此直接禁止了该用法;而LIKE因匹配逻辑更简单,支持这种列作为模式的关联场景。
替代方案
既然你需要维护单一规则表且想用正则类匹配,推荐将TableB中的所有模式合并为一个单一的正则表达式后再匹配,这样既保留了规则表的维护便利性,又能绕过Redshift的限制,同时提升查询效率(数百条规则合并后只需一次匹配)。
方案1:用SIMILAR TO匹配合并后的模式
如果你的Pattern列已经是符合SIMILAR TO语法的模式(比如原LIKE的%foo%在SIMILAR TO中同样生效),可以直接合并:
WITH combined_patterns AS ( SELECT string_agg(Pattern, '|') AS combined_regex FROM TableB ) SELECT A.* FROM TableA A CROSS JOIN combined_patterns cp WHERE A.Col SIMILAR TO cp.combined_regex;
方案2:用REGEXP_LIKE匹配转换后的正则模式
如果需要更灵活的正则匹配,推荐使用Redshift支持的REGEXP_LIKE函数(基于Perl兼容正则),先将原LIKE模式转换为正则语法:
WITH converted_patterns AS ( -- 将LIKE的%替换为.*,_替换为.,再合并为多选项正则 SELECT string_agg(REPLACE(REPLACE(Pattern, '%', '.*'), '_', '.'), '|') AS regex_pattern FROM TableB ) SELECT A.* FROM TableA A CROSS JOIN converted_patterns cp WHERE REGEXP_LIKE(A.Col, cp.regex_pattern);
额外说明
- 合并模式的方式比原LIKE关联更高效:原JOIN方式会让TableA的每条记录与TableB的数百条记录逐一匹配,合并后只需一次正则匹配,性能提升明显。
- 如果TableB的Pattern列本身就是POSIX正则语法,直接用方案1即可;如果是LIKE语法,方案2的转换更稳妥。
内容的提问来源于stack exchange,提问作者JimmyBuffet_Express
相关产品推荐
相关产品推荐

