SQL如何删除表URL列中Location标识后的多余路径字符串
URL字段清洗方案
核心需求是截取URL中Location段的完整内容,丢弃该段之后的所有路径。你之前用charindex未成功,通常是没有兼容两种场景:Location为URL最后一段(无后续内容)、Location后存在斜杠拼接的多余内容。
实现逻辑
- 先定位字符串
Location在URL中的起始位置 - 从该起始位置向后查找第一个路径分隔符
/的位置 - 如果找到该分隔符,截取URL开头到分隔符前一位的内容;如果未找到分隔符,说明当前URL已经符合要求,直接保留原值
SQL Server 可用写法(适配charindex函数)
SELECT url_field, CASE WHEN CHARINDEX('/', url_field, CHARINDEX('Location', url_field)) > 0 THEN LEFT(url_field, CHARINDEX('/', url_field, CHARINDEX('Location', url_field)) - 1) ELSE url_field END AS cleaned_url FROM your_table_name;
用你提供的样例数据执行后,返回结果和预期完全一致:
https://xyz.sharepoint.com/sites/tender/lp/46/Lists/PlaceDetails/Location3 https://xyz.sharepoint.com/sites/tender/lp/50/Lists/PlaceDetails/Location2 https://xyz.sharepoint.com/sites/tender/lp/52/Lists/PlaceDetails/Location5 https://xyz.sharepoint.com/sites/tender/lp/50/Lists/PlaceDetails/Location6
常见踩坑点
- 不要给
Location后的内容写固定截取长度,因为Location后缀的数字位数不固定(比如Location10是两位数字,Location2是一位数字),固定长度会出现截断不全或者多截的问题 - 必须加
CASE判断是否存在后续斜杠,否则对于没有后续内容的URL,CHARINDEX会返回0,执行LEFT(url_field, 0-1)会触发报错或者返回空值
其他数据库适配参考
如果使用MySQL,将CHARINDEX替换为LOCATE即可,逻辑完全一致:
SELECT url_field, CASE WHEN LOCATE('/', url_field, LOCATE('Location', url_field)) > 0 THEN LEFT(url_field, LOCATE('/', url_field, LOCATE('Location', url_field)) - 1) ELSE url_field END AS cleaned_url FROM your_table_name;
如果使用PostgreSQL,将CHARINDEX替换为STRPOS,截取函数调整为SUBSTRING即可。
内容的提问来源于stack exchange,提问作者Mr Nothing
相关产品推荐
相关产品推荐

