如何使用SQL重排字符串字符修正2020年前图片路径的最后目录格式
解决SQL路径最后目录格式调整的问题
嘿,我来帮你搞定这个路径格式修改的需求!因为你们没有专职DBA,我尽量把步骤讲得直白易懂,确保你能顺利操作。
核心思路
我们要精准定位Path字段里最后一个目录(也就是倒数第二个\到最后一个\之间的部分),然后对2020年前的目录(前4位年份≤2019)做格式转换:把YYYYMMDD####拆成YYYY+MMDD+####,再重新拼接成MMDDYYYY####,最后替换回原路径。
分步实现(以SQL Server为例)
1. 先验证修改效果(必做!)
先运行SELECT语句,确认转换后的路径是否符合预期,避免直接更新出错:
SELECT Path AS 原始路径, -- 构造转换后的新路径 LEFT(Path, LEN(LEFT(Path, LEN(Path) - CHARINDEX('\', REVERSE(Path)))) - CHARINDEX('\', REVERSE(LEFT(Path, LEN(Path) - CHARINDEX('\', REVERSE(Path))))) + 1) + CASE -- 判断目录年份是否≤2019 WHEN SUBSTRING(要修改的目录名, 1, 4) <= '2019' THEN SUBSTRING(要修改的目录名, 5, 4) -- 提取MMDD + SUBSTRING(要修改的目录名, 1, 4) -- 提取YYYY + SUBSTRING(要修改的目录名, 9, LEN(要修改的目录名) - 8) -- 提取批次号#### ELSE 要修改的目录名 -- 2020年及以后的目录不修改 END + '\' AS 转换后路径 FROM 你的表名 WHERE Path LIKE '\\ImageServer\2019\0121\%' -- 筛选需要处理的路径范围 -- 下面是上面用到的「要修改的目录名」的完整提取逻辑,替换到上面的语句中即可 CROSS APPLY ( SELECT SUBSTRING(Path, LEN(LEFT(Path, LEN(Path) - CHARINDEX('\', REVERSE(Path)))) - CHARINDEX('\', REVERSE(LEFT(Path, LEN(Path) - CHARINDEX('\', REVERSE(Path))))) + 2, CHARINDEX('\', REVERSE(Path)) - 1) AS 要修改的目录名 ) AS 临时表
2. 执行更新操作(验证无误后再运行)
确认SELECT的结果正确后,再运行UPDATE语句修改数据:
UPDATE 你的表名 SET Path = LEFT(Path, LEN(LEFT(Path, LEN(Path) - CHARINDEX('\', REVERSE(Path)))) - CHARINDEX('\', REVERSE(LEFT(Path, LEN(Path) - CHARINDEX('\', REVERSE(Path))))) + 1) + CASE WHEN SUBSTRING(要修改的目录名, 1, 4) <= '2019' THEN SUBSTRING(要修改的目录名, 5, 4) + SUBSTRING(要修改的目录名, 1, 4) + SUBSTRING(要修改的目录名, 9, LEN(要修改的目录名) - 8) ELSE 要修改的目录名 END + '\' FROM 你的表名 CROSS APPLY ( SELECT SUBSTRING(Path, LEN(LEFT(Path, LEN(Path) - CHARINDEX('\', REVERSE(Path)))) - CHARINDEX('\', REVERSE(LEFT(Path, LEN(Path) - CHARINDEX('\', REVERSE(Path))))) + 2, CHARINDEX('\', REVERSE(Path)) - 1) AS 要修改的目录名 ) AS 临时表 WHERE Path LIKE '\\ImageServer\2019\0121\%' AND SUBSTRING(要修改的目录名, 1, 4) <= '2019' -- 只修改2020年前的目录,避免误改
关键逻辑解释
我把核心的字符串操作拆解开,方便你理解:
REVERSE(Path):把路径反转,这样找最后一个\就变成找反转后的第一个\,更容易定位。CHARINDEX('\', REVERSE(Path)):获取反转后第一个\的位置,从而算出原路径最后一个\的位置。CROSS APPLY:把提取目录名的逻辑封装成临时表,让主语句更简洁,也方便调试。SUBSTRING:精准提取目录名的不同部分:前4位是年份,5-8位是月日,9位及以后是批次号,再重新拼接成目标格式。
重要注意事项
- 备份数据!备份数据!备份数据!:执行UPDATE前一定要先备份表数据,或者开启事务,万一出错可以回滚。
- 多批次验证:如果数据量很大,可以先选一小部分数据测试(比如加
TOP 10),确认没问题再全量更新。 - 其他数据库适配:如果你们用的是MySQL、Oracle等数据库,函数名会有差异(比如MySQL用
INSTR代替CHARINDEX,LENGTH代替LEN),但核心思路完全一致,只需要替换对应的函数即可。
内容的提问来源于stack exchange,提问作者SHADOWSTRIKE1
相关产品推荐
相关产品推荐

