1. 问题描述
sql语句的where条件中,使用 type like 'object_%' ,期望筛选出以"object_" 开头的数据,如 object_test, object_data 等。
但返回结果里包含了 "objectAnything"这种不含下划线"_"的数据。
2. 问题分析
这个问题很典型,是由于 _(下划线)在 SQL LIKE 语句中是通配符 导致的。
在 SQL 的 LIKE 语句中:
%匹配任意数量的字符(包括零个字符)_匹配单个任意字符
所以当写 type LIKE 'object_%' 时,实际匹配的是:
- 以 "object" 开头
- 后面跟任意一个字符
- 然后再跟任意数量的字符
因此 objectAnything 被匹配到是因为:
- object ✅ 匹配前六个字符
- A ✅ 匹配
_(任意单个字符) - nything ✅ 匹配
%(剩余所有字符)
3. 解决方案
如果想匹配字面意义上的下划线 _,需要使用 转义字符.
方法1:使用 ESCAPE 子句(推荐)
sql
-- 使用反斜杠作为转义字符
SELECT * FROM your_table WHERE type LIKE 'object\_%' ESCAPE '\';
-- 或者使用其他转义字符,比如 !
SELECT * FROM your_table WHERE type LIKE 'object!_%' ESCAPE '!';
方法2:使用方括号(SQL Server 特有)
sql
-- SQL Server 中可以将通配符放在方括号中
SELECT * FROM your_table WHERE type LIKE 'object[_]%';
方法3:使用等号精确匹配前缀(如果适用)
sql
SELECT * FROM your_table WHERE LEFT(type, 7) = 'object_';