SQL字符串处理大全:从基础到高阶的完整指南

Delores,2025年4月9日

字符串处理是SQL中最常见的操作之一,广泛应用于数据清洗、格式化、分析和报告生成。本文系统整理了SQL中的字符串函数,涵盖**基础操作、高级处理、正则表达式和跨数据库差异**,并提供实际场景示例,帮助开发者快速掌握字符串处理的核心技能。

---

### 一、基础字符串操作函数

#### 1. **拼接与分割**
| 函数                 | 语法示例                         | 功能说明                                                                 |
|----------------------|----------------------------------|--------------------------------------------------------------------------|
| `CONCAT`             | `CONCAT(str1, str2, ...)`        | 拼接多个字符串,若任一参数为NULL,某些数据库(如MySQL)返回NULL,某些忽略NULL。 |
| `CONCAT_WS`          | `CONCAT_WS(分隔符, str1, str2)`  | 用指定分隔符拼接字符串,自动跳过NULL(如 `CONCAT_WS('-', 'A', NULL, 'B') → 'A-B'`)。 |
| `SPLIT_PART`         | `SPLIT_PART('A,B,C', ',', 2)`    | 按分隔符分割字符串并取第N部分(如返回'B'),PostgreSQL支持。              |

#### 2. **截取与定位**
| 函数                 | 语法示例                         | 说明                                                                     |
|----------------------|----------------------------------|--------------------------------------------------------------------------|
| `SUBSTR`/`SUBSTRING` | `SUBSTR('Hello', 2, 3)`         | 从第2字符开始截取3个字符(返回'ell'),注意**起始索引从1开始**。           |
| `LEFT`/`RIGHT`       | `LEFT('SQL', 2)`                | 取左/右侧指定长度字符(返回'SQ')。                                       |
| `INSTR`/`CHARINDEX`  | `INSTR('Hello', 'l')`           | 返回子字符串首次出现的位置(返回3,注意MySQL从1开始计数)。                |

#### 3. **长度与格式化**
| 函数                 | 语法示例                         | 说明                                                                     |
|----------------------|----------------------------------|--------------------------------------------------------------------------|
| `LENGTH`/`LEN`       | `LENGTH('中文')`                | 返回字节数(UTF-8中'中文'返回6),`CHAR_LENGTH`返回字符数(返回2)。       |
| `UPPER`/`LOWER`      | `UPPER('abc')`                  | 转换字符串为大写/小写(返回'ABC')。                                       |
| `TRIM`/`LTRIM`/`RTRIM` | `TRIM('  SQL  ')`              | 删除两端空格(返回'SQL'),支持指定删除字符(如`TRIM(LEADING '0' FROM '000123')`)。 |

---

### 二、高级字符串处理

#### 1. **字符串替换与填充**
| 函数                 | 语法示例                         | 场景案例                                                                 |
|----------------------|----------------------------------|--------------------------------------------------------------------------|
| `REPLACE`            | `REPLACE('A,B,C', ',', '-')`    | 替换所有匹配的子字符串(返回'A-B-C')。                                    |
| `TRANSLATE`          | `TRANSLATE('abc', 'ab', 'XY')`  | 按字符映射替换('a→X', 'b→Y',返回'XYc'),Oracle/PostgreSQL支持。        |
| `LPAD`/`RPAD`        | `LPAD('5', 3, '0')`             | 左侧填充字符到指定长度(返回'005')。                                      |

#### 2. **正则表达式**
| 函数                 | 语法示例                         | 说明                                                                     |
|----------------------|----------------------------------|--------------------------------------------------------------------------|
| `REGEXP_REPLACE`     | `REGEXP_REPLACE('A1B2', '[0-9]', 'X')` | 正则替换(返回'AXBX'),支持复杂模式匹配。                                 |
| `REGEXP_SUBSTR`      | `REGEXP_SUBSTR('ID:123', '[0-9]+')`    | 提取匹配正则的子字符串(返回'123')。                                      |
| `REGEXP_LIKE`        | `WHERE REGEXP_LIKE(name, '^J')`        | 过滤符合正则的行(如筛选以J开头的名字)。                                  |

#### 3. **聚合与生成**
| 函数                 | 语法示例                         | 场景案例                                                                 |
|----------------------|----------------------------------|--------------------------------------------------------------------------|
| `GROUP_CONCAT`       | `GROUP_CONCAT(name SEPARATOR ',')`     | 将分组结果拼接为字符串(MySQL特有,返回'A,B,C')。                        |
| `STRING_AGG`         | `STRING_AGG(name, ',' ORDER BY id)`    | 功能同上,PostgreSQL/SQL Server支持(需指定排序)。                        |
| `REPEAT`             | `REPEAT('X', 3)`                | 重复字符串多次(返回'XXX')。                                              |

---

### 三、跨数据库差异与避坑指南

#### 1. **函数名与参数差异**
• **截取函数**:  
  • MySQL:`SUBSTR(str, start, length)`  
  • SQL Server:`SUBSTRING(str, start, length)`  
  • PostgreSQL:`SUBSTRING(str FROM start FOR length)`  
• **正则表达式**:  
  • PostgreSQL支持`~`操作符(如`WHERE str ~ '^A'`),MySQL需用`REGEXP`。  

#### 2. **NULL处理逻辑**
• `CONCAT('A', NULL)`:  
  • MySQL返回'A'(忽略NULL),Oracle/SQL Server返回NULL。  
• 使用`COALESCE`规避NULL:  
  ```sql
  SELECT CONCAT(COALESCE(str1, ''), COALESCE(str2, '')) FROM table;
  ```

#### 3. **编码与字符集问题**
• 多字节字符(如中文)处理:  
  • `LENGTH('中文')`在UTF-8中返回6(字节数),`CHAR_LENGTH`返回2(字符数)。  
  • 使用`CAST`转换字符集:`CAST(str AS VARCHAR(10) CHARACTER SET utf8)`。  

---

### 四、实战场景案例

#### 1. **数据清洗:手机号脱敏**
```sql
-- 将'13812345678'处理为'138****5678'
SELECT CONCAT(SUBSTR(phone, 1, 3), '****', SUBSTR(phone, 8)) 
FROM users;
```

#### 2. **动态SQL生成**
```sql
-- 拼接查询条件(如筛选状态为1或3的用户)
SELECT CONCAT('SELECT * FROM orders WHERE status IN (', GROUP_CONCAT(status), ')') 
FROM (SELECT DISTINCT status FROM config) AS t;
```

#### 3. **地址格式化**
```sql
-- 将'北京市;海淀区;中关村'转换为'北京市-海淀区-中关村'
SELECT REPLACE(address, ';', '-') AS formatted_address 
FROM addresses;
```

---

### 五、总结
掌握SQL字符串函数是高效处理数据的基础,需注意:  
1. **明确需求**:选择截取、替换、拼接或正则匹配。  
2. **关注跨数据库差异**:如函数名、参数顺序和NULL处理逻辑。  
3. **性能优化**:避免在大数据集上频繁使用正则或复杂嵌套函数。  
4. **测试验证**:尤其在处理多语言和特殊字符时,确保结果符合预期。