SQL 字符串函数如何查找字符位置?

来源:网络学院作者:葵司头衔:网络博主
导读:本期聚焦于小伙伴创作的《SQL 字符串函数如何查找字符位置?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《SQL 字符串函数如何查找字符位置?》有用,将其分享出去将是对创作者最好的鼓励。

在SQL的实际使用中,查找指定字符或子字符串在目标字符串中的位置是高频需求,不同数据库系统提供了不同的内置字符串函数来实现这个功能,下面分别介绍主流数据库的相关函数用法。

SQL 字符串函数如何查找字符位置?

SQL Server中的CHARINDEX函数

SQL Server使用CHARINDEX函数来查找字符位置,该函数返回子字符串在目标字符串中第一次出现的起始位置,位置计数从1开始,如果未找到则返回0。

函数语法

语法格式为:CHARINDEX(expressionToFind, expressionToSearch [, start_location]),其中expressionToFind是要查找的子字符串,expressionToSearch是目标字符串,start_location是可选参数,表示从目标字符串的哪个位置开始查找,默认从第一个字符开始。

使用示例

-- 查找字符a在字符串abcde中的位置
SELECT CHARINDEX('a', 'abcde') AS position; -- 返回1

-- 从第三个字符开始查找字符c的位置
SELECT CHARINDEX('c', 'abcdeabcde', 3) AS position; -- 返回3

-- 查找不存在的子字符串
SELECT CHARINDEX('x', 'abcde') AS position; -- 返回0

MySQL中的INSTR和LOCATE函数

MySQL提供了两个常用的字符位置查找函数,分别是INSTRLOCATE,两者的功能类似但参数顺序不同。

INSTR函数

INSTR的语法为INSTR(str, substr),返回子字符串substr在字符串str中第一次出现的位置,位置从1开始,未找到返回0。

-- 查找bc在字符串abcde中的位置
SELECT INSTR('abcde', 'bc') AS position; -- 返回2

-- 查找不存在的子字符串
SELECT INSTR('abcde', 'f') AS position; -- 返回0

LOCATE函数

LOCATE的语法为LOCATE(substr, str [, pos]),参数顺序和INSTR相反,pos是可选的开始查找位置参数。

-- 查找de在字符串abcde中的位置
SELECT LOCATE('de', 'abcde') AS position; -- 返回4

-- 从第三个字符开始查找c的位置
SELECT LOCATE('c', 'abcdeabcde', 3) AS position; -- 返回3

Oracle中的INSTR函数

Oracle的INSTR函数功能更丰富,支持指定查找的起始位置和出现的次数。

函数语法

语法为INSTR(string, substring [, start_position [, nth_appearance]])start_position是起始查找位置,正数表示从左边开始,负数表示从右边开始;nth_appearance表示要查找第几次出现的位置,默认是1。

使用示例

-- 查找b第一次出现的位置
SELECT INSTR('abcdeabcde', 'b') AS position FROM DUAL; -- 返回2

-- 从右边开始查找b第一次出现的位置
SELECT INSTR('abcdeabcde', 'b', -1) AS position FROM DUAL; -- 返回7

-- 查找b第二次出现的位置
SELECT INSTR('abcdeabcde', 'b', 1, 2) AS position FROM DUAL; -- 返回7

不同函数的注意事项

  • 所有函数的位置计数都是从1开始,和很多编程语言的从0开始不同,使用时需要注意。
  • 如果目标字符串或者要查找的子字符串为NULL,大部分函数会返回NULL,需要做空值判断。
  • 部分函数对大小写敏感,比如SQL Server的CHARINDEX默认不区分大小写,而Oracle的INSTR默认区分大小写,大小写敏感规则可以通过数据库的排序规则调整。

实际应用场景

查找字符位置的函数常和字符串截取函数配合使用,比如需要先找到某个分隔符的位置,再截取分隔符前后的内容。例如要截取邮箱的用户名部分,可以先找到@符号的位置,再截取@之前的字符串:

-- SQL Server示例,截取邮箱用户名
SELECT 
    email,
    LEFT(email, CHARINDEX('@', email) - 1) AS username
FROM 
    (SELECT 'test@ippipp.com' AS email) t;

-- 注意:如果邮箱中没有@符号,CHARINDEX返回0,LEFT函数会报错,实际使用时需要加判断
SELECT 
    email,
    CASE 
        WHEN CHARINDEX('@', email) > 0 THEN LEFT(email, CHARINDEX('@', email) - 1)
        ELSE email
    END AS username
FROM 
    (SELECT 'test@ippipp.com' AS email) t;

SQL字符串函数字符位置查找CHARINDEXINSTR修改时间:2026-07-22 13:30:26

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