好的,我来给你做一个Oracle 中 SUBSTR()
函数的详解及应用,从概念、语法、参数、示例到注意事项都覆盖。
Oracle SUBSTR()
函数详解
1️⃣ 基本概念
SUBSTR()
是 Oracle 提供的字符串截取函数,用于从指定字符串中截取子串。
它常用于:
- 提取字段的部分内容
- 数据清洗
- 格式化输出
- 与其他函数组合使用实现复杂字符串处理
2️⃣ 语法
SUBSTR(string, start_position [, length])
参数说明
参数 | 说明 |
---|---|
string | 要截取的字符串,可以是列名或字符串常量。 |
start_position | 开始截取的位置(从 1 开始计数);负数表示从字符串末尾开始计算。 |
length (可选) | 截取的长度(字符数);默认截取到字符串末尾。 |
3️⃣ 使用规则
- 起始位置为正数:从左到右数,例如 1 表示第一个字符。
- 起始位置为负数:从右到左数,例如 -1 表示最后一个字符。
- 长度为负数或 0:长度为 0 返回空字符串;负数会报错。
- 长度超过剩余字符数:截取到字符串末尾,不报错。
4️⃣ 示例
4.1 基本截取
SELECT SUBSTR('Oracle SQL', 1, 6) AS result FROM dual;
-- 结果: 'Oracle'
解释:从第 1 个字符开始,截取 6 个字符。
4.2 省略长度
SELECT SUBSTR('Oracle SQL', 8) AS result FROM dual;
-- 结果: 'SQL'
解释:从第 8 个字符开始,一直截取到字符串末尾。
4.3 使用负数位置
SELECT SUBSTR('Oracle SQL', -3, 3) AS result FROM dual;
-- 结果: 'SQL'
解释:从右边第 3 个字符开始,截取 3 个字符。
4.4 与 INSTR()
结合
-- 提取邮箱的用户名部分
SELECT SUBSTR('ajie@example.com', 1, INSTR('ajie@example.com','@') - 1) AS username FROM dual;
-- 结果: 'ajie'
解释:通过 INSTR()
找到 ‘@’ 的位置,再截取前面的字符。
4.5 与 REPLACE
/TRIM
结合
-- 截取去掉空格的前 5 个字符
SELECT SUBSTR(TRIM(' Hello World '), 1, 5) AS result FROM dual;
-- 结果: 'Hello'
5️⃣ 注意事项
- Oracle 字符串从 1 开始计数,不像某些编程语言从 0 开始。
- 如果
start_position
超出字符串长度:- 正数:返回空字符串
- 负数:返回空字符串
SUBSTR()
支持 多字节字符(如中文),但长度计数按字符数,不按字节。- 与
LENGTH()
配合使用可以动态截取字符串:
SELECT SUBSTR('Hello World', LENGTH('Hello World')-4, 5) AS result FROM dual;
-- 结果: 'World'
6️⃣ 总结
SUBSTR()
用于从字符串中提取子串,是 Oracle 字符串处理最常用函数之一。- 支持正负位置、可选长度,灵活性高。
- 可与
INSTR()
,LENGTH()
,TRIM()
等函数组合,实现复杂字符串处理。 - 注意多字节字符、索引起始位置和长度的边界情况。
发表回复