SUBSTRING是SQL中用于从指定位置截取固定长度子串的核心函数,不同数据库语法略有差异:SQL Server/PostgreSQL/MySQL 8.0+支持SUBSTRING(str, start, length)和SUBSTRING(str FROM start FOR length),MySQL 5.7及更早用SUBSTR(),Oracle用SUBSTR(str, start, length)且起始位置从1开始;LEFT、RIGHT适用于左右端截取;CHARINDEX(SQL Server)、INSTR/POSITION(MySQL/PostgreSQL)用于定位字符位置以辅助截取;LEN/LENGTH、TRIM、REPLACE、UPPER/LOWER等常配合使用完成字符串清洗。

SUBSTRING 是 SQL 中最常用的字符串截取函数之一,用于从指定位置开始提取固定长度的子串。不同数据库对它的写法略有差异,但核心逻辑一致:起始位置、截取长度。掌握它,能快速处理姓名、编号、日期等字段的拆分需求。
SUBSTRING 函数的三种常见写法
不同数据库系统支持的语法略有不同,实际使用时需注意兼容性:
-
SQL Server / PostgreSQL / MySQL 8.0+:支持
SUBSTRING(str, start, length)和SUBSTRING(str FROM start FOR length)两种形式 -
MySQL 5.7 及更早版本:常用
SUBSTR()(与SUBSTRING()完全同义),如SUBSTR('HelloWorld', 6, 5)返回'World' -
Oracle:使用
SUBSTR(str, start, length),注意起始位置从 1 开始(不是 0)
LEFT、RIGHT:更直观的左右截取
当只需要取字符串开头或末尾若干字符时,LEFT 和 RIGHT 比 SUBSTRING 更简洁易读:
-
LEFT('2024-05-12', 4)→'2024'(取左边 4 位) -
RIGHT('order_10086', 5)→'10086'(取右边 5 位) - 仅在 SQL Server、MySQL 8.0+、PostgreSQL 中原生支持;Oracle 和旧版 MySQL 需用 SUBSTRING 替代
CHARINDEX / INSTR / POSITION:定位字符位置是截取的前提
真正灵活的字符串处理,往往要先找位置再截取。不同库的“查找函数”名称不同,但作用一样:
-
SQL Server:
CHARINDEX('a', 'banana')→ 返回2(首次出现位置) -
MySQL / PostgreSQL:
INSTR('banana', 'a')或POSITION('a' IN 'banana') - 常配合 SUBSTRING 使用,例如提取邮箱 @ 符号后的域名:
SUBSTRING(email, CHARINDEX('@', email) + 1, LEN(email))
其他高频实用函数补充
除了截取和定位,这些函数也常一起出现在字符串清洗场景中:
- LEN() / LENGTH():获取字符串长度(SQL Server 用 LEN,其余多用 LENGTH)
- TRIM() / LTRIM() / RTRIM():去除空格(标准 SQL 支持 TRIM,SQL Server 用 RTRIM+LTRIM)
-
REPLACE():替换内容,如
REPLACE(phone, '-', '')清除电话中的短横线 - UPPER() / LOWER():统一大小写,便于比对或展示
实际写 SQL 时,别硬记所有函数名,先明确目标:要切哪一段?从哪开始?长度多少?有没有特殊符号做分界?顺着这个思路,再查对应数据库的函数文档,很快就能组合出准确语句。










