好的,我来给你做一个Oracle 中 SUBSTR() 函数的详解及应用,从概念、语法、参数、示例到注意事项都覆盖。


Oracle SUBSTR() 函数详解

1️⃣ 基本概念

SUBSTR() 是 Oracle 提供的字符串截取函数,用于从指定字符串中截取子串。
它常用于:

  • 提取字段的部分内容
  • 数据清洗
  • 格式化输出
  • 与其他函数组合使用实现复杂字符串处理

2️⃣ 语法

SUBSTR(string, start_position [, length])

参数说明

参数说明
string要截取的字符串,可以是列名或字符串常量。
start_position开始截取的位置(从 1 开始计数);负数表示从字符串末尾开始计算。
length (可选)截取的长度(字符数);默认截取到字符串末尾。

3️⃣ 使用规则

  1. 起始位置为正数:从左到右数,例如 1 表示第一个字符。
  2. 起始位置为负数:从右到左数,例如 -1 表示最后一个字符。
  3. 长度为负数或 0:长度为 0 返回空字符串;负数会报错。
  4. 长度超过剩余字符数:截取到字符串末尾,不报错。

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️⃣ 注意事项

  1. Oracle 字符串从 1 开始计数,不像某些编程语言从 0 开始。
  2. 如果 start_position 超出字符串长度:
    • 正数:返回空字符串
    • 负数:返回空字符串
  3. SUBSTR() 支持 多字节字符(如中文),但长度计数按字符数,不按字节。
  4. 与 LENGTH() 配合使用可以动态截取字符串:
SELECT SUBSTR('Hello World', LENGTH('Hello World')-4, 5) AS result FROM dual;
-- 结果: 'World'


6️⃣ 总结

  • SUBSTR() 用于从字符串中提取子串,是 Oracle 字符串处理最常用函数之一。
  • 支持正负位置、可选长度,灵活性高。
  • 可与 INSTR()LENGTH()TRIM() 等函数组合,实现复杂字符串处理。
  • 注意多字节字符、索引起始位置和长度的边界情况。