
SQL 中的字符串函数 CONCAT 和 SUBSTRING 是处理文本数据最常用、最实用的两个工具。它们不改变原数据,却能灵活拼接、截取字段内容,特别适合报表生成、数据清洗和格式标准化。
CONCAT:安全拼接多个字符串
CONCAT 函数用于将两个或多个字符串连接成一个新字符串。它会自动忽略 NULL 值(多数数据库如 MySQL、PostgreSQL 支持此行为),比用 + 或 || 更稳妥。
- 基本写法:
CONCAT(str1, str2, ..., strN),支持任意数量参数 - 常见用途:合并姓名字段(如
CONCAT(first_name, ' ', last_name))、添加固定前缀(如CONCAT('ID-', id)) - 注意:MySQL 8.0+ 支持
CONCAT_WS(带分隔符拼接),例如CONCAT_WS(', ', city, province, country)可避免手动加逗号和空格
SUBSTRING:精准提取子串
SUBSTRING(部分数据库也写作 SUBSTR)从指定位置开始,按长度截取字符串。掌握起始位置和长度的含义是关键——多数 SQL 方言中,**起始位置从 1 开始计数**,不是 0。
- 标准语法:
SUBSTRING(str, start_pos, length);省略 length 时取到末尾 - 实用场景:提取手机号前3位(
SUBSTRING(phone, 1, 3))、获取邮箱域名(SUBSTRING(email, POSITION('@' IN email) + 1)) - 小技巧:配合
POSITION(或INSTR)动态定位分隔符,比硬编码位置更健壮
组合使用:解决真实业务问题
单独用函数有限,组合起来才体现威力。比如统一处理用户昵称:去除空格、转大写、截取前10字符、再加“_VIP”后缀。
- 示例:
CONCAT(UPPER(TRIM(nickname)), '_VIP')→ 先清理再拼接 - 进阶示例:从路径
/user/12345/profile提取 ID:SUBSTRING(path, 7, POSITION('/' IN SUBSTRING(path, 7)) - 1),或更清晰写法:SUBSTRING(path, 7, POSITION('/' IN SUBSTRING(path, 7)) - 1) - 提醒:嵌套过深会影响可读性,复杂逻辑建议用视图或应用层处理
兼容性与注意事项
不同数据库对函数名和参数略有差异,实际使用前需确认环境:
- SQL Server 用
SUBSTRING(str, start, length),但拼接推荐+运算符(CONCAT仅 SQL Server 2012+ 支持) - Oracle 无
CONCAT多参数版本,只能嵌套使用:CONCAT(CONCAT(a,b),c),或直接用|| - 所有方言中,SUBSTRING 超出范围不会报错,而是返回实际存在的子串(如长度为负或起始位置越界,结果为空字符串)










