在Oracle数据库的日常开发中,字符串处理是很常见的操作,substr作为内置的字符串截取函数,使用频率非常高,不过不少用户对它的参数规则和使用细节还存在疑惑,下面我们就详细讲解它的用法。

Oracle substr函数基本语法
substr函数的核心作用是从源字符串中截取指定长度的子字符串,它的完整语法有两种形式:
-- 语法1:指定起始位置和截取长度 SUBSTR(string, start_position, [length]) -- 语法2:只指定起始位置,截取到字符串末尾 SUBSTR(string, start_position)
各个参数的含义如下:
- string:必填参数,表示需要被截取的源字符串,可以是字符类型的字段、字符串常量或者返回字符串的表达式。
- start_position:必填参数,表示截取的起始位置,需要注意Oracle中字符串的索引是从1开始的,不是从0开始。
- length:可选参数,表示需要截取的长度,如果省略该参数,函数会从起始位置开始一直截取到源字符串的末尾。
参数细节说明
起始位置的特殊规则
start_position的取值可以是正数也可以是负数:
- 当start_position为正数时,从字符串的左边第start_position位开始截取。
- 当start_position为负数时,从字符串的右边第abs(start_position)位开始截取,也就是从末尾往前数。
截取长度的特殊规则
- 如果length的值大于从起始位置到字符串末尾的剩余长度,函数会自动截取到字符串末尾,不会报错。
- 如果length的值为0或者负数,函数会返回空字符串。
常见使用示例
下面通过实际的SQL示例来展示不同场景下的使用效果:
-- 示例1:从左边开始截取,指定起始位置和长度
SELECT SUBSTR('HelloWorld', 1, 5) AS result FROM DUAL;
-- 返回结果:Hello
-- 示例2:从左边开始截取,不指定长度,截取到末尾
SELECT SUBSTR('HelloWorld', 6) AS result FROM DUAL;
-- 返回结果:World
-- 示例3:使用负数起始位置,从右边开始数位置
SELECT SUBSTR('HelloWorld', -5, 3) AS result FROM DUAL;
-- 返回结果:Wor
-- 示例4:截取长度超过剩余长度,自动截取到末尾
SELECT SUBSTR('HelloWorld', 6, 10) AS result FROM DUAL;
-- 返回结果:World
-- 示例5:对表字段使用substr函数
-- 假设有用户表user_info,id_card字段存储身份证号,截取前6位作为地区码
SELECT id, SUBSTR(id_card, 1, 6) AS area_code FROM user_info;实际开发常见场景
- 身份证号处理:截取身份证号的前6位作为地区码,第7到14位作为出生日期,倒数第2位判断性别。
- 手机号脱敏:截取手机号前3位和后4位,中间用星号替换,实现隐私保护。
- 日志内容提取:从长日志字符串中截取关键的错误码或者关键信息片段。
- 日期格式处理:如果日期存储为字符串格式,可以用substr截取年、月、日部分做单独处理。
注意事项
1. Oracle的substr函数索引从1开始,和很多编程语言从0开始不同,使用时不要混淆。
2. 如果源字符串是NULL,substr函数的返回值也是NULL。
3. 处理中文字符时,需要注意数据库字符集,一般UTF8下一个中文占3个字节,如果是按字节截取可能会出现乱码,这时候可以结合length函数判断字符长度。
熟练掌握substr函数的用法,可以极大提升Oracle字符串处理的效率,应对大部分截取需求都能轻松解决。