导读:本期聚焦于Canve创作的《SQL 字符串函数如何判断是否包含字符?判断包含关系的多种方法详解》,敬请观看详情。在数据库查询中判断某个字符串是否包含特定字符或子串,是高频又容易出错的场景。本文围绕SQL中的字符串包含判断展开,系统讲解LIKE模糊匹配、CHARINDEX、PATINDEX、INSTR、LOCATE、POSITION等常用函数的语法差异与适用场景,并对比SQL Server、MySQL、Oracle等主流数据库的写法区别。文中还给出通配符转义、大小写敏感、性能影响等实战细节,帮助你根据实际需求选择合适的判断方式,写出既准确又高效的查询语句。

判断一个字符串字段里是否包含某个字符或子串,看起来是件小事,但在实际项目中却经常引发问题:有人用LIKE导致全表扫描拖垮接口性能,有人在MySQL里照搬SQL Server的CHARINDEX直接报错,还有人被大小写敏感、通配符转义这些细节坑过。本文把SQL中判断字符串包含关系的几种主流方法逐一拆开讲清楚,包括写法、原理、跨数据库差异以及容易被忽视的坑。

SQL 字符串函数如何判断是否包含字符?判断包含关系的多种方法详解

一、LIKE 模糊匹配:最常用的判断方式

LIKE是SQL标准中定义的模糊匹配操作符,几乎所有数据库都支持。判断是否包含某段子串时,只需要在前后各加一个百分号:WHERE name LIKE '%abc%'。百分号匹配任意长度(包括零长度)的字符序列,因此两侧包裹目标子串就等价于包含判断。

需要注意通配符的差异。除了百分号,SQL Server和MySQL还支持下划线_匹配单个字符,方括号[]是SQL Server特有的字符集合语法,例如LIKE '%[0-9]%'可以判断字符串中是否包含数字。如果目标子串本身包含百分号或下划线,必须显式转义,否则匹配结果会出错。

-- SQL Server 中转义下划线,判断是否包含字面意义的下划线
SELECT * FROM users WHERE name LIKE '%\_%' ESCAPE '\';

-- SQL Server 判断是否包含数字字符
SELECT * FROM products WHERE code LIKE '%[0-9]%';

-- MySQL 判断是否包含数字,只能借助REGEXP
SELECT * FROM products WHERE code REGEXP '[0-9]';

LIKE的返回值是布尔型,只能用于WHERE、CASE WHEN等条件位置,不能直接拿到匹配的位置信息,这是它和后面几个函数的本质区别。另外要警惕前置百分号带来的索引失效问题,数据量大时应考虑全文索引或倒排类方案。

二、CHARINDEX 与 PATINDEX:SQL Server 的两把利器

CHARINDEX是SQL Server中最直接的包含判断函数,语法为CHARINDEX(要找的字符串, 被搜索的字符串[, 起始位置]),返回子串第一次出现的起始位置,找不到返回0。配合大于零的比较就能完成包含判断:

-- 返回位置大于0即表示包含
SELECT * FROM articles WHERE CHARINDEX('数据库', title) > 0;

-- 从第5个字符开始查找,常用于跳过前缀
SELECT CHARINDEX('a', 'banana banana', 5) AS pos;  -- 结果为 4 之后的出现位置

PATINDEX可以理解为支持通配符的CHARINDEX,语法是PATINDEX('%模式%', 字符串),模式部分可以写百分号、下划线、方括号等通配符。例如PATINDEX('%[0-9]%', col)返回第一个数字出现的位置,配合SUBSTRING可以精准提取数字片段,这是CHARINDEX做不到的。

两者返回值都可能是0或具体位置,判断包含时务必写大于0而不是不等于-1,这是从其他语言习惯迁移过来最容易犯的错。

三、MySQL 与 Oracle:INSTR、LOCATE、POSITION 各有千秋

MySQL中首选INSTR,语法为INSTR(被搜索的字符串, 要找的字符串)。注意参数顺序和CHARINDEX正好相反,跨库迁移时这是经典陷阱。LOCATE则和CHARINDEX参数顺序一致,还支持第三个参数指定起始位置。POSITION是标准SQL写法,使用特殊语法POSITION('abc' IN col)

-- MySQL 三种等价写法
SELECT * FROM users WHERE INSTR(name, '张') > 0;
SELECT * FROM users WHERE LOCATE('张', name) > 0;
SELECT * FROM users WHERE POSITION('张' IN name) > 0;

-- Oracle 中的 INSTR 支持更丰富的参数
SELECT INSTR('hello world hello', 'hello', 1, 2) FROM dual;  -- 从第1字符起找第2次出现,返回14

Oracle的INSTR功能最强大,支持起始位置和第几次出现两个扩展参数,甚至允许起始位置为负数表示从尾部倒数查找,处理分隔符提取场景时非常灵活。此外Oracle还提供INSTRB按字节查找,中文场景要注意字符集区别。

还要注意大小写问题。SQL Server默认排序规则不区分大小写,而Oracle和很多MySQL排序规则默认区分大小写。如果需要忽略大小写判断,可以在比较前统一转换:WHERE INSTR(LOWER(name), LOWER('ABC')) > 0

四、方法选型建议与性能注意事项

从功能上选:只需要判断是否包含,LIKE最简洁通用;需要拿到位置做进一步截取,用CHARINDEX、PATINDEX或INSTR;需要模式匹配(比如包含数字、包含某几个字符之一),SQL Server用PATINDEX或LIKE加方括号,MySQL用REGEXP,Oracle用REGEXP_LIKE。

从性能上讲,无论是前置百分号的LIKE还是这类定位函数,多数情况下都无法走普通索引,会触发全表扫描。数据量在几十万以内通常无感,超过百万级就要考虑优化:为字段建立全文索引(MySQL的FULLTEXT、SQL Server的全文检索)、引入搜索引擎中间件,或者把高频查询的包含关系冗余成标志位字段。函数写在字段上会导致索引失效,这一点在写WHERE条件时要时刻提醒自己。

最后给一个跨库兼容的小技巧:如果项目需要同时兼容多个数据库,优先使用标准SQL的POSITION或者INSTR在条件中做大于零判断,配合各数据库的方言适配层封装,可以大幅减少迁移成本。掌握这些函数的参数顺序、返回值约定和大小写规则,包含判断这类问题基本不会再成为绊脚石。

SQL字符串函数CHARINDEXPATINDEXLIKEINSTRLOCATE修改时间:2026-09-15 20:46:52

免责声明:已尽一切努力确保本网站所含信息的准确性。网站作品多为原创整理与精心创作,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们进行处理Email:chomcom@qq.com。
引用或转载本作品时,请注明当前出处:https://www.ipipp.com/html/20260915/57491.html,基于非商业用途的前提下,欢迎转载或二创本作品。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。