如何在SQL Server中用STRING_SPLIT拆分并反转含112的列字符串
解决SQL Server中反转特定格式字符串列的问题
嘿,我懂你的困扰——STRING_SPLIT确实没法像数组那样直接用索引访问元素,这是它的一个小局限,但我们有好几种靠谱的方法能实现你的需求!
方法一:用字符串截取函数(兼容性最好)
这个方法不需要依赖STRING_SPLIT,适用于所有支持CHARINDEX、LEFT、RIGHT的SQL Server版本,逻辑也很直接:找到分隔符/的位置,拆分出前后两部分,判断目标部分是否包含112,如果是就交换顺序拼接。
直接上UPDATE语句:
UPDATE tblTableName SET siteUrl = RIGHT(siteUrl, LEN(siteUrl) - CHARINDEX('/', siteUrl)) + '/' + LEFT(siteUrl, CHARINDEX('/', siteUrl) - 1) WHERE CHARINDEX('/', siteUrl) > 0 -- 确保列值里有分隔符,避免出错 AND RIGHT(siteUrl, LEN(siteUrl) - CHARINDEX('/', siteUrl)) LIKE '%112%'
代码解释:
CHARINDEX('/', siteUrl):找到第一个/在字符串中的位置LEFT(siteUrl, CHARINDEX('/', siteUrl)-1):截取/左边的内容(也就是你说的child部分)RIGHT(siteUrl, LEN(siteUrl)-CHARINDEX('/', siteUrl)):截取/右边的内容(也就是parent部分)- 条件里先过滤掉没有
/的行,再判断右边的部分是否包含112,符合条件才执行反转更新
方法二:结合STRING_SPLIT和窗口函数(适合SQL Server 2016+)
如果你坚持想用STRING_SPLIT,可以通过窗口函数给拆分后的每一行标上序号,再把两行内容转成两列来拼接。注意:STRING_SPLIT在SQL Server 2022之前不保证拆分顺序,所以用ROW_NUMBER()的时候要注意,或者在2022+版本用带序号的参数。
SQL Server 2016-2019版本:
WITH SplitData AS ( SELECT siteUrl, Value, ROW_NUMBER() OVER (PARTITION BY siteUrl ORDER BY (SELECT NULL)) AS RowNum FROM tblTableName WHERE CHARINDEX('/', siteUrl) > 0 CROSS APPLY STRING_SPLIT(siteUrl, '/') ) UPDATE t SET t.siteUrl = s2.Value + '/' + s1.Value FROM tblTableName t JOIN SplitData s1 ON t.siteUrl = s1.siteUrl AND s1.RowNum = 1 JOIN SplitData s2 ON t.siteUrl = s2.siteUrl AND s2.RowNum = 2 WHERE s2.Value LIKE '%112%'
SQL Server 2022及以上版本(更可靠):
2022开始STRING_SPLIT支持enable_ordinal参数,能直接返回拆分内容的原始顺序,不用依赖ROW_NUMBER():
WITH SplitData AS ( SELECT siteUrl, Value, ordinal FROM tblTableName WHERE CHARINDEX('/', siteUrl) > 0 CROSS APPLY STRING_SPLIT(siteUrl, '/', 1) -- 1表示启用序号返回 ) UPDATE t SET t.siteUrl = s2.Value + '/' + s1.Value FROM tblTableName t JOIN SplitData s1 ON t.siteUrl = s1.siteUrl AND s1.ordinal = 1 JOIN SplitData s2 ON t.siteUrl = s2.siteUrl AND s2.ordinal = 2 WHERE s2.Value LIKE '%112%'
小提醒
- 执行UPDATE前建议先跑一遍SELECT语句验证结果,避免误操作:
SELECT siteUrl, RIGHT(siteUrl, LEN(siteUrl) - CHARINDEX('/', siteUrl)) + '/' + LEFT(siteUrl, CHARINDEX('/', siteUrl) - 1) AS new_siteUrl FROM tblTableName WHERE CHARINDEX('/', siteUrl) > 0 AND RIGHT(siteUrl, LEN(siteUrl) - CHARINDEX('/', siteUrl)) LIKE '%112%' - 如果你的列值可能有多个
/(比如a/b/c),这些方法只会处理第一个/的情况,如果你需要处理多分隔符的场景,得调整逻辑哦。
内容的提问来源于stack exchange,提问作者Vignesh Subramanian
相关产品推荐
相关产品推荐

