SQL 字符串函数 CONCAT、SUBSTRING 应用

8次阅读

SQL 字符串函数 CONCAT、SUBSTRING 应用

sql 中的字符串函数 CONCATSUBSTRING 是处理文本数据最常用、最实用的两个工具。它们不改变原数据,却能灵活拼接、截取字段内容,特别适合报表生成、数据清洗和格式标准化。

CONCAT:安全拼接多个字符串

CONCAT 函数用于将两个或多个字符串连接成一个新字符串。它会自动忽略 NULL 值(多数数据库mysqlpostgresql 支持此行为),比用 +|| 更稳妥。

  • 基本写法: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+ 支持)
  • oracleCONCAT 多参数版本,只能嵌套使用:CONCAT(CONCAT(a,b),c),或直接用 ||
  • 所有方言中,SUBSTRING 超出范围不会报错,而是返回实际存在的子串(如长度为负或起始位置越界,结果为空字符串)
text=ZqhQzanResources