SQL提取字符串中指定次数斜杠间子串的问题求助
提取URL中指定分隔符间的内容
需求说明
给定URL字符串:https://www.facebook.com/9876543219876/posts/123456789123456/,需完成两个提取任务:
- 提取第3个与第4个
/之间的内容:9876543219876 - 提取第5个与第6个
/之间的内容:123456789123456
解决方案
方法1:嵌套CHARINDEX定位(兼容多数SQL版本)
通过多次调用CHARINDEX函数逐步定位目标分隔符的位置,再用SUBSTRING截取内容。
提取第3-4个/之间的用户ID
DECLARE @url NVARCHAR(255) = 'https://www.facebook.com/9876543219876/posts/123456789123456/' -- 定位第3个/的位置 DECLARE @pos3 INT = CHARINDEX('/', @url, CHARINDEX('/', @url, CHARINDEX('/', @url) + 1) + 1) -- 定位第4个/的位置 DECLARE @pos4 INT = CHARINDEX('/', @url, @pos3 + 1) -- 截取内容 SELECT SUBSTRING(@url, @pos3 + 1, @pos4 - @pos3 - 1) AS UserID
提取第5-6个/之间的帖子ID
DECLARE @url NVARCHAR(255) = 'https://www.facebook.com/9876543219876/posts/123456789123456/' -- 定位第5个/的位置 DECLARE @pos5 INT = CHARINDEX('/', @url, CHARINDEX('/', @url, CHARINDEX('/', @url, CHARINDEX('/', @url, CHARINDEX('/', @url) + 1) + 1) + 1) + 1) -- 定位第6个/的位置 DECLARE @pos6 INT = CHARINDEX('/', @url, @pos5 + 1) -- 截取内容 SELECT SUBSTRING(@url, @pos5 + 1, @pos6 - @pos5 - 1) AS PostID
方法2:使用STRING_SPLIT(SQL Server 2016及以上版本)
将URL按/拆分后,通过行号筛选直接获取目标内容:
提取用户ID(对应拆分后的第4段)
DECLARE @url NVARCHAR(255) = 'https://www.facebook.com/9876543219876/posts/123456789123456/' SELECT value AS UserID FROM STRING_SPLIT(@url, '/') ORDER BY (SELECT NULL) OFFSET 3 ROWS FETCH NEXT 1 ROW ONLY
提取帖子ID(对应拆分后的第6段)
DECLARE @url NVARCHAR(255) = 'https://www.facebook.com/9876543219876/posts/123456789123456/' SELECT value AS PostID FROM STRING_SPLIT(@url, '/') ORDER BY (SELECT NULL) OFFSET 5 ROWS FETCH NEXT 1 ROW ONLY
说明
- 嵌套
CHARINDEX的方式无需依赖特定SQL版本,每次调用时通过第三个参数指定搜索起始位置,确保定位到下一个分隔符。 STRING_SPLIT写法更简洁,但要注意:原URL开头的//会生成两个空行,所以目标内容对应的行号需按实际拆分结果调整。
内容的提问来源于stack exchange,提问作者pkmmast
相关产品推荐
相关产品推荐

