SQL使用LIKE运算符匹配&和and字符串时误匹配如何解决
问题根因
你当前的写法存在两个核心问题:
- SQL 标准中
LIKE运算符不支持同时传入多个匹配模式,你现有的写法能运行属于对应数据库的自定义扩展,实际执行逻辑等价于name LIKE '%&%' OR name LIKE '%and%' %and%是无差别匹配所有包含and子串的内容,不会区分and是否为独立存在的单元,因此会命中candy、sandy、anderson这类内置and子串的字符串。
解决方案
你需要通过正则匹配来实现「仅匹配独立存在的and」的需求,不同数据库的正则语法略有差异,以下是主流数据库的实现方案:
匹配逻辑统一为:满足以下任意一个条件即可命中
- 字段包含
&子串(如果你的数据库中存储的是未转义的&,直接替换为&即可)- 字段包含独立的
and:即and的前后为非字母字符,或处于字符串的开头/结尾
MySQL 写法
SELECT name FROM t1 WHERE name LIKE '%&%' OR name REGEXP '[[:<:]]and[[:>:]]';
其中[[:<:]]和[[:>:]]是MySQL专属的单词边界符,只会匹配and作为独立单词的场景。
PostgreSQL 写法
SELECT name FROM t1 WHERE name LIKE '%&%' OR name ~ '\mand\M';
\m表示单词开头,\M表示单词结尾,用来实现独立单词匹配。
SQL Server 写法
SELECT name FROM t1 WHERE name LIKE '%&%' OR name LIKE '%[^a-zA-Z]and[^a-zA-Z]%' OR name LIKE 'and[^a-zA-Z]%' OR name LIKE '%[^a-zA-Z]and' OR name = 'and';
通过多条件覆盖and在字符串开头、中间、结尾、单独作为值的所有独立存在场景。
Oracle 写法
SELECT name FROM t1 WHERE name LIKE '%&%' OR REGEXP_LIKE(name, '\band\b');
Oracle使用\b作为单词边界符实现独立单词匹配。
内容的提问来源于stack exchange,提问作者rinku
相关产品推荐
相关产品推荐

