You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:50:05