好的,阿杰,我给你整理一份 Oracle 中 SUBSTR() 函数详解及应用,涵盖语法、参数、示例和注意事项。


1. SUBSTR() 函数概述

  • 功能:从字符串中提取指定位置和长度的子串。
  • 类型:字符串函数(String Function)
  • 返回值:截取的子串

2. 语法

SUBSTR(string, start_position [, length])

参数说明

参数说明
string要截取的原始字符串
start_position截取的起始位置(1 表示第一个字符)支持负数,表示从字符串末尾倒数开始
length可选,截取的字符数如果省略,表示从起始位置截取到字符串末尾

3. 使用规则

  1. start_position > 0
    • 从字符串开头第 start_position 个字符开始截取
    • 示例:
    SELECT SUBSTR('Hello World', 7, 5) FROM dual; 输出: World
  2. start_position < 0
    • 从字符串末尾开始倒数计算位置
    • 示例:
    SELECT SUBSTR('Hello World', -5, 3) FROM dual; 输出: Wor
    • 解释:倒数第 5 个字符开始,截取 3 个字符
  3. length 省略
    • 截取从 start_position 到末尾的所有字符
    SELECT SUBSTR('Hello World', 7) FROM dual; 输出: World
  4. length 超过剩余字符长度
    • 不会报错,直接截取到字符串末尾
    SELECT SUBSTR('Hello', 3, 10) FROM dual; 输出: llo

4. 常见应用示例

(1)提取固定位置字符

SELECT SUBSTR('20250925', 1, 4) AS year FROM dual;
-- 输出: 2025

(2)提取文件扩展名

SELECT SUBSTR('report.xlsx', INSTR('report.xlsx', '.') + 1) AS ext FROM dual;
-- 输出: xlsx

说明:配合 INSTR() 定位字符位置

(3)从右向左截取字符串

SELECT SUBSTR('HelloWorld', -5) AS right_part FROM dual;
-- 输出: World

(4)截取电话号码中间部分

SELECT SUBSTR('13812345678', 4, 4) AS mid_num FROM dual;
-- 输出: 1234


5. 注意事项

  1. 字符位置从 1 开始,不是从 0。
  2. start_position 超出字符串范围:返回空字符串。
  3. length 为负数:在 Oracle 中会报错,不支持负长度。
  4. 多字节字符:对中文或 UTF-8 字符,需要注意字符长度与字节长度的区别,可结合 SUBSTRB() 使用。

6. 扩展用法

  • SUBSTRB(string, start_position [, length])
    • 字节截取,而非字符
    • 在处理中文或多字节编码时使用
  • INSTR() 配合:
SELECT SUBSTR('abc_def_ghi', INSTR('abc_def_ghi','_')+1, 3) AS mid
FROM dual;
-- 输出: def

  • 可结合 UPPER()LOWER()TRIM() 做字符串清洗