如何将SQL的WHERE子句转换为正则表达式以简化重复LIKE条件
SQL 正则改写方案
你原SQL中的LIKE没有通配符,实际是精确匹配X-1、X-2、X-3三个值,不同数据库的正则语法存在差异,以下是主流数据库的实现方式:
核心正则逻辑
统一匹配规则为^X-[123]$,其中:
^匹配字符串开头,避免匹配到AX-1这类前缀不符合的内容[123]匹配1、2、3中的任意一个字符$匹配字符串结尾,避免匹配到X-10这类后缀不符合的内容
各数据库具体写法
MySQL / MariaDB
使用REGEXP运算符,默认不区分大小写,需要区分大小写可加BINARY关键字:SELECT * FROM my_table WHERE series REGEXP '^X-[123]$'; -- 区分大小写写法:WHERE series REGEXP BINARY '^X-[123]$'PostgreSQL
使用~运算符(区分大小写),不区分大小写可替换为~*:SELECT * FROM my_table WHERE series ~ '^X-[123]$';Oracle
使用REGEXP_LIKE函数:SELECT * FROM my_table WHERE REGEXP_LIKE(series, '^X-[123]$');SQL Server
除了正则写法外,SQL Server原生LIKE支持范围匹配,不需要额外用正则就能简化:-- 原生LIKE简化写法(兼容性更好) SELECT * FROM my_table WHERE series LIKE 'X-[123]'; -- 正则写法(SQL Server 2017及以上支持) SELECT * FROM my_table WHERE REGEXP_MATCH(series, '^X-[123]$') = 1;
额外建议
如果你的场景需要兼容多类数据库,或者需要利用series字段的索引提升查询性能,更推荐用IN写法替代正则,性能和兼容性都更优:
SELECT * FROM my_table WHERE series IN ('X-1','X-2','X-3');
内容的提问来源于stack exchange,提问作者Nurdin
相关产品推荐
相关产品推荐

