SQL字符串处理是数据库开发中的基础操作,不同业务场景下需要用到不同的字符串函数来实现数据转换、清洗和拼接需求,掌握高频场景的处理方法能大幅提升开发效率。

基础字符串拼接场景
拼接多个字段是字符串处理最常见的需求,不同数据库的拼接语法略有差异,下面分别展示MySQL和Oracle的实现方式。
MySQL拼接实例
MySQL使用CONCAT函数拼接字符串,如果拼接的字段中有NULL值,结果会直接返回NULL,需要配合IFNULL处理空值。
-- 拼接用户姓名和手机号,空手机号替换为未知
SELECT
CONCAT(user_name, ' 手机号:', IFNULL(phone, '未知')) AS user_info
FROM user_table;
Oracle拼接实例
Oracle支持||拼接符和CONCAT函数两种拼接方式,||拼接时NULL值会被忽略,不会返回NULL结果。
-- 拼接用户地址信息
SELECT
province || city || district AS full_address
FROM user_address;
子串提取场景
从长字符串中提取指定部分内容是常见需求,比如从身份证号中提取出生日期,从邮箱中提取域名部分。
提取身份证出生日期
18位身份证号的第7到14位是出生日期,使用SUBSTRING函数可以提取指定位置的子串。
-- 提取身份证中的出生日期,格式转为YYYY-MM-DD
SELECT
SUBSTRING(id_card, 7, 8) AS birth_date_raw,
CONCAT(
SUBSTRING(id_card, 7, 4), '-',
SUBSTRING(id_card, 11, 2), '-',
SUBSTRING(id_card, 13, 2)
) AS birth_date
FROM user_info
WHERE LENGTH(id_card) = 18;
提取邮箱域名
先通过INSTR函数找到邮箱中@符号的位置,再使用SUBSTRING截取@后面的部分。
-- 提取邮箱域名部分
SELECT
email,
SUBSTRING(email, INSTR(email, '@') + 1) AS email_domain
FROM user_table
WHERE email LIKE '%@%';
特殊字符替换场景
数据清洗时经常需要替换字符串中的特殊字符,比如换行符、多余空格、敏感词等。
替换换行符和多余空格
使用REPLACE函数可以替换指定字符,嵌套使用可以处理多种特殊字符。
-- 替换内容中的换行符为空格,再替换连续多个空格为单个空格
SELECT
content,
REPLACE(
REPLACE(content, 'n', ' '),
' ',
' '
) AS cleaned_content
FROM article_table;
批量替换敏感词
如果有多个敏感词需要替换,可以通过多次嵌套REPLACE实现,也可以结合临时表批量处理。
-- 替换内容中的敏感词为**
SELECT
comment_content,
REPLACE(
REPLACE(
REPLACE(comment_content, '敏感词1', '**'),
'敏感词2', '**'
),
'敏感词3', '**'
) AS safe_content
FROM comment_table;
空值处理场景
字符串字段的空值处理需要区分NULL和空字符串两种情况,避免逻辑错误。
统一空值显示
使用COALESCE函数或者IFNULL函数将NULL值转为指定默认字符串,同时处理空字符串的情况。
-- 将NULL和空字符串都转为未填写
SELECT
user_name,
CASE
WHEN COALESCE(nickname, '') = '' THEN '未填写'
ELSE nickname
END AS display_nickname
FROM user_table;
常见问题说明
- 不同数据库的字符串函数名称可能有差异,比如MySQL的
SUBSTRING和Oracle的SUBSTR功能类似但参数顺序不同 - 处理中文字符串时需要注意字符集问题,避免截取出现乱码
- 字符串函数的嵌套使用要注意括号匹配,避免语法错误