题解 | 评论替换和去除(庆祝刷完基础篇)

评论替换和去除

https://www.nowcoder.com/practice/0038f5db08a64ec2851f2e219a06a121

select id, replace(comment, ',', '') comment
from comment_detail
where char_length(comment) > 3

在 SQL 中,字符串操作是处理文本数据的核心能力,常用于数据清洗、格式转换、内容提取等场景。不同数据库(如 MySQL、PostgreSQL、SQL Server)的函数语法略有差异,以下按通用场景分类整理,并标注主流数据库的差异:

一、字符串拼接

将多个字符串合并为一个。

基础拼接

CONCAT(str1, str2, ...)

CONCAT(str1, str2, ...)

CONCAT(str1, str2, ...)

指定分隔符拼接

CONCAT_WS(sep, str1, str2...)

STRING_AGG(str, sep)

STRING_AGG(str, sep)

示例

  • MySQL:CONCAT('Hello', ' ', 'World') → 'Hello World'
  • MySQL:CONCAT_WS(',', 'a', NULL, 'b') → 'a,b'(忽略 NULL)
  • PostgreSQL/SQL Server:STRING_AGG(name, ',') → 按逗号拼接列 name 的所有值

二、字符串长度

计算字符串的长度(字符数或字节数)。

LENGTH(str)

返回字节长度(受字符集影响,如 UTF-8 中汉字占 3 字节)

所有主流数据库

CHAR_LENGTH(str)

返回字符数量(1 个汉字算 1 字符)

MySQL、PostgreSQL

DATALENGTH(str)

LENGTH(字节长度)

SQL Server

LEN(str)

返回字符数量(忽略尾部空格)

SQL Server

示例

  • LENGTH('你好') → 6(UTF-8 下,2 个汉字 ×3 字节)
  • CHAR_LENGTH('你好') → 2

三、字符串截取

从指定位置提取子串。

按位置截取

SUBSTRING(str, pos, len)

SUBSTRING(str FROM pos FOR len)

SUBSTRING(str, pos, len)

从左侧截取

LEFT(str, len)

LEFT(str, len)

LEFT(str, len)

从右侧截取

RIGHT(str, len)

RIGHT(str, len)

RIGHT(str, len)

按分隔符截取

SUBSTRING_INDEX(str, sep, n)

需自定义函数或组合操作

需用CHARINDEX配合截取

示例

  • 按位置:SUBSTRING('abcdef', 2, 3) → 'bcd'(从第 2 位取 3 个字符)
  • 左侧:LEFT('abcdef', 3) → 'abc'
  • MySQL 分隔符截取:SUBSTRING_INDEX('a,b,c,d', ',', 2) → 'a,b'

四、字符串替换

替换字符串中的指定内容。

REPLACE(str, old, new)

替换所有oldnew

所有主流数据库

REGEXP_REPLACE(str, regex, new)

按正则表达式替换(MySQL 8.0+ 支持)

MySQL、PostgreSQL

STUFF(str, pos, len, new)

pos位置删除len个字符并插入new

SQL Server

示例

  • REPLACE('a,b,c,a', 'a', 'x') → 'x,b,c,x'
  • SQL Server:STUFF('abcdef', 2, 3, 'xyz') → 'axyzef'

五、大小写转换

转换字符串的大小写。

UPPER(str)

转为大写

所有主流数据库

LOWER(str)

转为小写

所有主流数据库

INITCAP(str)

首字母大写(其他小写)

PostgreSQL、Oracle

示例

  • UPPER('hello') → 'HELLO'
  • PostgreSQL:INITCAP('hello world') → 'Hello World'

六、去除空格

删除字符串首尾的空格或指定字符。

TRIM([remstr FROM] str)

去除首尾指定字符(默认空格)

MySQL、PostgreSQL

LTRIM(str)

去除左侧空格

所有主流数据库

RTRIM(str)

去除右侧空格

所有主流数据库

TRIM(str)

仅去除首尾空格(SQL Server)

SQL Server

示例

  • TRIM(' abc ') → 'abc'
  • MySQL:TRIM('x' FROM 'xxabcxx') → 'abc'

七、查找与定位

查找子串在字符串中的位置。

LOCATE(substr, str, [pos])

pos开始查找substr,返回位置(从 1 开始,未找到返回 0)

MySQL、PostgreSQL

CHARINDEX(substr, str, [pos])

LOCATE(参数顺序相同)

SQL Server

INSTR(str, substr)

LOCATE(参数顺序相反:str, substr

MySQL

示例

  • LOCATE('cd', 'abcdef') → 4
  • SQL Server:CHARINDEX('cd', 'abcdef') → 4

八、其他常用操作

重复字符串

REPEAT(str, n):重复strn

REPEAT('ab', 3)'ababab'

填充字符串

LPAD(str, len, pad):左侧填充至长度len

LPAD('123', 5, '0')'00123'

反转字符串

REVERSE(str):反转字符串

REVERSE('abc')'cba'

注意事项

  1. 不同数据库的函数兼容性有限,例如 SUBSTRING_INDEX 是 MySQL 特有,其他数据库需用 LOCATE+SUBSTRING 组合实现。
  2. 处理中文等多字节字符时,优先使用 CHAR_LENGTH(字符数)而非 LENGTH(字节数),避免字符集导致的误差。
  3. 复杂字符串操作(如正则提取)建议结合数据库特性,例如 PostgreSQL 的 REGEXP_MATCHES、SQL Server 的 PATINDEX 等。
全部评论

相关推荐

2025-12-29 12:02
dd Java
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务