SQLite如何查询列值包含通配符%或_的记录
SQLite 匹配LIKE通配符本身(%、_)的查询方法
SQLite的LIKE语句中,%默认匹配任意长度任意字符,_默认匹配单个任意字符,要筛选字段值里包含这两个字符本身的记录,有两种可直接落地的实现方式:
场景1:筛选指定列包含%字符的记录
方法1:转义通配符+LIKE匹配
自定义转义字符,将需要匹配的字面%标记为普通字符即可,示例查询:
SELECT * FROM tbl WHERE col2 LIKE '%/%%' ESCAPE '/';
语句逻辑说明:
- 末尾的
ESCAPE '/'表示声明/为当前语句的转义符 - 模式串中被
/修饰的%(即/%)是要匹配的字面百分号,不会被解析为通配符 - 模式串首尾未被转义的两个
%是通配符,代表目标百分号的前后可以存在任意长度的任意内容,也就是“只要字段里包含%就命中”
方法2:用instr函数直接定位(更简单)
绕开LIKE的通配符规则,用SQLite原生的instr函数直接判断字符是否存在,不需要写转义逻辑:
SELECT * FROM tbl WHERE instr(col2, '%') > 0;
instr(字段名, 待查找内容)会返回待查找内容在字段值中首次出现的位置,不存在则返回0,判断返回值大于0即可筛选出包含目标字符的记录。
场景2:筛选指定列包含_字符的记录
逻辑和匹配%完全一致:
方法1:转义通配符+LIKE匹配
SELECT * FROM tbl WHERE col3 LIKE '%/_%' ESCAPE '/';
方法2:instr函数直接定位
SELECT * FROM tbl WHERE instr(col3, '_') > 0;
补充说明
- 用LIKE转义方案时,转义字符可以自行选择,不强制用
/,只要保证ESCAPE声明的转义符和模式串里使用的一致即可,比如用!作为转义符时,语句可以写成SELECT * FROM tbl WHERE col2 LIKE '%!%%' ESCAPE '!';,效果完全相同,注意选一个不会出现在字段实际内容里的字符当转义符就行。 - 两种写法在SQLite中性能没有明显差异,LIKE转义写法符合通用SQL标准,跨数据库兼容性更好;instr写法更简洁,不容易写错转义逻辑。
内容的提问来源于stack exchange,提问作者Léa Massiot
相关产品推荐
相关产品推荐

