You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 '%&amp;%' 
  OR name ~ '\mand\M';

\m表示单词开头,\M表示单词结尾,用来实现独立单词匹配。

SQL Server 写法

SELECT name FROM t1 
WHERE 
  name LIKE '%&amp;%' 
  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 '%&amp;%' 
  OR REGEXP_LIKE(name, '\band\b');

Oracle使用\b作为单词边界符实现独立单词匹配。

内容的提问来源于stack exchange,提问作者rinku

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 16:51:03