SUBSTRING函数用于截取字符串,需指定源字符串、起始位置(从1开始)和长度;可结合CHARINDEX等函数动态截取,常用于数据清洗、脱敏及解析结构化数据,但需注意起始位置错误、NULL处理及性能问题,尤其避免在WHERE子句中导致索引失效。

在SQL里,要从一个字符串里截取你想要的那部分内容,
SUBSTRING
SUBSTRING
语法结构:
SUBSTRING(源字符串, 起始位置, 截取长度)
实际例子来感受一下:
从字符串开头截取: 假如你有一个产品编号
'PROD-2023-001'
'PROD'
SELECT SUBSTRING('PROD-2023-001', 1, 4);
-- 结果会是 'PROD'从字符串中间截取: 还是那个产品编号,如果你想拿到年份
'2023'
SELECT SUBSTRING('PROD-2023-001', 6, 4);
-- 结果会是 '2023'这里6是因为
P-R-O-D--
截取到字符串末尾: 如果你想截取产品编号的最后一部分
'001'
SELECT SUBSTRING('PROD-2023-001', 11, 100); -- 100是个足够大的数字
-- 结果会是 '001'这里,即使你给的截取长度
100
结合其他函数动态截取: 有时候你并不知道要截取的部分具体在哪里,比如从一个URL中提取域名。这时候,
SUBSTRING
CHARINDEX
INSTR
LOCATE
'user@example.com'
'example.com'
-- SQL Server 示例
DECLARE @email VARCHAR(100) = 'user@example.com';
SELECT SUBSTRING(@email, CHARINDEX('@', @email) + 1, LEN(@email) - CHARINDEX('@', @email));
-- 结果会是 'example.com'这里
CHARINDEX('@', @email)@
LEN(@email) - CHARINDEX('@', @email)@
在我看来,虽然核心功能都是字符串截取,但
SUBSTRING
SQL Server 和 MySQL: 这两个是比较一致的,都用
SUBSTRING(string, start, length)
SUBSTR
PostgreSQL: PostgreSQL也支持
SUBSTRING(string, start, length)
SUBSTR
SUBSTRING(string FROM start FOR length)
FROM
FOR
Oracle: Oracle通常使用
SUBSTR(string, start, length)
SUBSTR
SUBSTR('abcdef', -2, 1)'e'
所以你看,虽然大家都在做截取这件事,但具体“怎么说”或者“怎么做”还是有点小区别的。当你从一个数据库切换到另一个时,稍微留意一下这些细节就能省去不少麻烦。
SUBSTRING
数据清洗与格式化: 比如,你有一批电话号码,有的带区号,有的不带,或者格式不统一(如
'138-1234-5678'
'(010)87654321'
SUBSTRING
REPLACE
CHARINDEX
-- 假设我们想统一提取手机号的后8位,且知道它们都在特定位置
SELECT SUBSTRING('13812345678', 4, 8); -- 提取'12345678'当然,实际情况会复杂得多,可能需要更多判断。
提取结构化数据中的特定字段: 很多时候,我们的数据是编码过的,比如一个订单号
'ORD-20231026-A001'
'20231026'
'A001'
SUBSTRING
-- 提取订单日期
SELECT SUBSTRING('ORD-20231026-A001', 5, 8);
-- 提取序列号
SELECT SUBSTRING('ORD-20231026-A001', 14, 4);敏感信息脱敏: 在展示用户数据时,出于隐私保护,我们经常需要对手机号、身份证号、邮箱等敏感信息进行部分隐藏。
SUBSTRING
13812345678
138****5678
SELECT SUBSTRING('13812345678', 1, 3) + '****' + SUBSTRING('13812345678', 8, 4);
-- 结果:'138****5678'日志分析与URL参数解析: 从日志中提取特定的错误代码,或者从URL的查询字符串中解析出某个参数的值,
SUBSTRING
CHARINDEX
可以说,只要你的数据里有规律可循的字符串结构,
SUBSTRING
在使用
SUBSTRING
常见的陷阱:
起始位置的“差一位”错误 (Off-by-one errors): 这是最常见的错误了。因为大多数数据库的
SUBSTRING
SUBSTRING(str, 0, 1)
NULL
NULL
SUBSTRING
NULL
NULL
ISNULL
COALESCE
长度参数的理解: 如果你给的
截取长度
起始位置
截取长度
字符集和字节长度: 这是一个比较深的问题,尤其是在处理多字节字符(如UTF-8编码的中文)时。在某些数据库(比如SQL Server),
LEN()
DATALENGTH()
SUBSTRING
截取长度
性能考量:
索引失效: 这是最关键的一点。如果你在
WHERE
SUBSTRING
WHERE SUBSTRING(ColumnA, 1, 5) = 'ABCDE'
ColumnA
SUBSTRING
SUBSTRING
计算开销: 尽管
SUBSTRING
SUBSTRING
替代方案的考量: 对于一些特定的截取需求,可能有更优化的函数。比如,如果你只是想截取字符串的开头部分,
LEFT()
SUBSTRING(string, 1, length)
RIGHT()
总的来说,
SUBSTRING
以上就是sql怎样使用substring截取字符串部分内容 sqlsubstring截取字符串的教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号