题解 | 评论替换和去除(庆祝刷完基础篇)
评论替换和去除
https://www.nowcoder.com/practice/0038f5db08a64ec2851f2e219a06a121
select id, replace(comment, ',', '') comment from comment_detail where char_length(comment) > 3
在 SQL 中,字符串操作是处理文本数据的核心能力,常用于数据清洗、格式转换、内容提取等场景。不同数据库(如 MySQL、PostgreSQL、SQL Server)的函数语法略有差异,以下按通用场景分类整理,并标注主流数据库的差异:
一、字符串拼接
将多个字符串合并为一个。
基础拼接 |
|
|
|
指定分隔符拼接 |
|
|
|
示例:
- MySQL:
CONCAT('Hello', ' ', 'World')→'Hello World' - MySQL:
CONCAT_WS(',', 'a', NULL, 'b')→'a,b'(忽略 NULL) - PostgreSQL/SQL Server:
STRING_AGG(name, ',')→ 按逗号拼接列name的所有值
二、字符串长度
计算字符串的长度(字符数或字节数)。
| 返回字节长度(受字符集影响,如 UTF-8 中汉字占 3 字节) | 所有主流数据库 |
| 返回字符数量(1 个汉字算 1 字符) | MySQL、PostgreSQL |
| 同 | SQL Server |
| 返回字符数量(忽略尾部空格) | SQL Server |
示例:
LENGTH('你好')→ 6(UTF-8 下,2 个汉字 ×3 字节)CHAR_LENGTH('你好')→ 2
三、字符串截取
从指定位置提取子串。
按位置截取 |
|
|
|
从左侧截取 |
|
|
|
从右侧截取 |
|
|
|
按分隔符截取 |
| 需自定义函数或组合操作 | 需用 |
示例:
- 按位置:
SUBSTRING('abcdef', 2, 3)→'bcd'(从第 2 位取 3 个字符) - 左侧:
LEFT('abcdef', 3)→'abc' - MySQL 分隔符截取:
SUBSTRING_INDEX('a,b,c,d', ',', 2)→'a,b'
四、字符串替换
替换字符串中的指定内容。
| 替换所有 | 所有主流数据库 |
| 按正则表达式替换(MySQL 8.0+ 支持) | MySQL、PostgreSQL |
| 从 | SQL Server |
示例:
REPLACE('a,b,c,a', 'a', 'x')→'x,b,c,x'- SQL Server:
STUFF('abcdef', 2, 3, 'xyz')→'axyzef'
五、大小写转换
转换字符串的大小写。
| 转为大写 | 所有主流数据库 |
| 转为小写 | 所有主流数据库 |
| 首字母大写(其他小写) | PostgreSQL、Oracle |
示例:
UPPER('hello')→'HELLO'- PostgreSQL:
INITCAP('hello world')→'Hello World'
六、去除空格
删除字符串首尾的空格或指定字符。
| 去除首尾指定字符(默认空格) | MySQL、PostgreSQL |
| 去除左侧空格 | 所有主流数据库 |
| 去除右侧空格 | 所有主流数据库 |
| 仅去除首尾空格(SQL Server) | SQL Server |
示例:
TRIM(' abc ')→'abc'- MySQL:
TRIM('x' FROM 'xxabcxx')→'abc'
七、查找与定位
查找子串在字符串中的位置。
| 从 | MySQL、PostgreSQL |
| 同 | SQL Server |
| 同 | MySQL |
示例:
LOCATE('cd', 'abcdef')→4- SQL Server:
CHARINDEX('cd', 'abcdef')→4
八、其他常用操作
重复字符串 |
|
|
填充字符串 |
|
|
反转字符串 |
|
|
注意事项
- 不同数据库的函数兼容性有限,例如
SUBSTRING_INDEX是 MySQL 特有,其他数据库需用LOCATE+SUBSTRING组合实现。 - 处理中文等多字节字符时,优先使用
CHAR_LENGTH(字符数)而非LENGTH(字节数),避免字符集导致的误差。 - 复杂字符串操作(如正则提取)建议结合数据库特性,例如 PostgreSQL 的
REGEXP_MATCHES、SQL Server 的PATINDEX等。
