Oracle SQL Developer中多条件LIKE筛选及查询优化方法
没问题!针对你这种多个LIKE条件堆叠的场景,确实可以用更简洁的写法来替代,不用创建新表,下面给你几种实用的方案:
方案1:使用正则表达式(推荐,简洁性拉满)
不同数据库的正则语法略有差异,给你列几个主流数据库的写法:
- MySQL/MariaDB:用
REGEXP或RLIKE操作符,把所有匹配模式整合到一个正则表达式中:
SELECT * FROM table WHERE var1 REGEXP '^file_X_2022_(1_(001|004|006)|8_(002|0015)|10_1000)';
解释:^限定字符串开头,括号用来分组,|表示“或”,完全等价于你原来的多个OR LIKE逻辑,而且维护起来更方便。
- PostgreSQL:用
~(大小写敏感)或~*(大小写不敏感)操作符:
SELECT * FROM table WHERE var1 ~ '^file_X_2022_(1_(001|004|006)|8_(002|0015)|10_1000)';
- SQL Server:用
PATINDEX函数(支持有限正则语法),或者结合子查询的方式(见方案2):
SELECT * FROM table WHERE PATINDEX('file_X_2022_1_00[146]%', var1) > 0 OR PATINDEX('file_X_2022_8_00(2|15)%', var1) > 0 OR PATINDEX('file_X_2022_10_1000%', var1) > 0;
方案2:用子查询模拟IN的效果(更贴近你想要的写法)
如果觉得正则不够直观,可以用VALUES子句生成前缀列表,再结合EXISTS实现类似IN的逻辑:
(适用于MySQL 8.0+、SQL Server、PostgreSQL等支持VALUES子查询的数据库)
SELECT t.* FROM table t WHERE EXISTS ( SELECT 1 FROM ( VALUES ('file_X_2022_1_001'), ('file_X_2022_1_004'), ('file_X_2022_1_006'), ('file_X_2022_8_002'), ('file_X_2022_8_0015'), ('file_X_2022_10_1000') ) AS prefixes(p) WHERE t.var1 LIKE CONCAT(p, '%') );
这种写法完全符合你“把所有条件整合到一个括号中”的需求,新增或删除前缀直接修改VALUES里的内容即可,可读性和维护性都很强。
内容的提问来源于stack exchange,提问作者Ruser-lab9
相关产品推荐
相关产品推荐

