
SQL中表的字符串内置函数详解
在数据库的日常操作中,字符串处理是极其常见的需求。无论是数据清洗、格式化输出,还是动态拼接查询条件,SQL内置的字符串函数都扮演着不可或缺的角色。本文将详细梳理SQL中常用的字符串内置函数,并结合实用场景进行解析。
一、 字符串长度与截取
1. 获取字符串长度
不同数据库系统获取长度的函数略有差异。MySQL中使用CHAR_LENGTH()或LENGTH(),SQL Server中使用LEN()。CHAR_LENGTH()按字符计算,而LENGTH()在某些数据库中按字节计算,处理多字节字符(如中文)时需注意区分。
-- 获取字符串长度
SELECT CHAR_LENGTH('www.ipipp.com') AS str_len; -- 返回 142. 字符串截取 (SUBSTRING / LEFT / RIGHT)
SUBSTRING是最通用的截取函数,LEFT和RIGHT则用于快速从两侧截取指定长度的字符。
-- SUBSTRING(字符串, 起始位置, 长度)
SELECT SUBSTRING('www.ipipp.com', 5, 5) AS sub_str; -- 返回 ipipp
-- LEFT(字符串, 长度) 和 RIGHT(字符串, 长度)
SELECT LEFT('www.ipipp.com', 3) AS prefix; -- 返回 www
SELECT RIGHT('www.ipipp.com', 3) AS suffix; -- 返回 com二、 字符串查找与定位
查找子串在父串中的位置,是后续替换和高级截取的基础。MySQL常用LOCATE()或INSTR(),SQL Server常用CHARINDEX()。如果未找到子串,通常返回0。
-- LOCATE(子串, 字符串) 返回子串首次出现的位置
SELECT LOCATE('ipipp', 'www.ipipp.com') AS pos; -- 返回 5
-- CHARINDEX(子串, 字符串) SQL Server写法
SELECT CHARINDEX('ipipp', 'www.ipipp.com') AS pos;三、 字符串替换与拼接
1. 字符串替换 (REPLACE)
REPLACE用于将字符串中指定的子串替换为新的子串,常用于数据脱敏或格式统一化清洗。
-- REPLACE(字符串, 被替换子串, 替换子串)
SELECT REPLACE('www.ipipp.com', 'ipipp', 'example') AS new_str; -- 返回 www.example.com2. 字符串拼接 (CONCAT)
CONCAT用于将多个字符串拼接在一起。在SQL Server中也可使用+运算符,但CONCAT能更好地处理NULL值,它会自动将NULL转换为空字符串,避免整体结果变为NULL。
-- CONCAT(字符串1, 字符串2, ...)
SELECT CONCAT('https://', 'www.ipipp.com') AS full_url; -- 返回 https://www.ipipp.com四、 大小写转换与空格处理
1. 大小写转换 (UPPER / LOWER)
在忽略大小写的查询条件或格式统一化时非常实用。
SELECT UPPER('ipipp') AS upper_str; -- 返回 IPOPP
SELECT LOWER('IPOPP') AS lower_str; -- 返回 ipopp2. 去除空格 (TRIM / LTRIM / RTRIM)
TRIM去除首尾空格,LTRIM去除左侧空格,RTRIM去除右侧空格。部分数据库(如MySQL 8.0+)的TRIM还支持指定去除的首尾特定字符。
SELECT TRIM(' www.ipipp.com ') AS trimmed_str; -- 返回 'www.ipipp.com'五、 综合实战场景:提取URL中的主域名
假设有一张用户访问记录表visit_logs,其中的url字段存储了完整的访问链接(例如https://www.ipipp.com/article/123),现在需要提取出主域名www.ipipp.com。我们可以通过组合使用定位与截取函数来实现。
SELECT
url,
SUBSTRING(
url,
LOCATE('://', url) + 3,
CASE
WHEN LOCATE('/', url, LOCATE('://', url) + 3) > 0
THEN LOCATE('/', url, LOCATE('://', url) + 3) - LOCATE('://', url) - 3
ELSE CHAR_LENGTH(url) - LOCATE('://', url) - 2
END
) AS domain_name
FROM visit_logs;上述SQL逻辑首先定位://的位置并加3跳过该协议前缀,然后计算从该起点到下一个/符号的长度,从而精准截取域名部分。若URL末尾没有/,则截取到字符串末尾。
总结
SQL的字符串内置函数虽然在不同数据库系统中存在细微的语法差异,但核心思想完全一致。熟练掌握截取、定位、替换与拼接,能够极大地提升在数据库层处理数据的效率,减少将数据导出至应用层再处理的网络与性能开销。