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

SQL Server 2012 如何按标签拆分单列字符串生成指定三列

SQL Server 2012 拆分带HTML标签列实现方案

你原有代码的核心问题是SUBSTRING只定义了起始位置、未截取对应字段的结束位置,导致取出的内容会包含后续字段的冗余信息,同时也没有去掉字段前的HTML标签前缀。

以下是可直接运行的实现代码:

WITH Positions AS (
    SELECT
        ColumnName,
        -- 定位各字段的起始标记位置
        CHARINDEX('<b>Application</b> : ', ColumnName) + LEN('<b>Application</b> : ') AS AppStart,
        CHARINDEX('<br/><b>Access Level</b> : ', ColumnName) AS AppEnd,
        CHARINDEX('<br/><b>Access Level</b> : ', ColumnName) + LEN('<br/><b>Access Level</b> : ') AS AccessStart,
        CHARINDEX('<br/><b>Restrictions</b> : ', ColumnName) AS AccessEnd,
        CHARINDEX('<br/><b>Restrictions</b> : ', ColumnName) + LEN('<br/><b>Restrictions</b> : ') AS RestrictStart
    FROM TableName
)
SELECT
    -- 截取Application:从AppStart到AppEnd之前的内容
    SUBSTRING(ColumnName, AppStart, AppEnd - AppStart) AS [Application],
    -- 截取Access Level:从AccessStart到AccessEnd之前的内容
    SUBSTRING(ColumnName, AccessStart, AccessEnd - AccessStart) AS [Access Level],
    -- 截取Restrictions:从RestrictStart到字符串末尾
    SUBSTRING(ColumnName, RestrictStart, LEN(ColumnName) - RestrictStart + 1) AS [Restrictions]
FROM Positions

如果需要兼容部分行缺失某个标签的场景,可以用ISNULL处理位置参数,避免CHARINDEX返回0导致截取报错,示例如下:

WITH Positions AS (
    SELECT
        ColumnName,
        ISNULL(CHARINDEX('<b>Application</b> : ', ColumnName) + LEN('<b>Application</b> : '), 1) AS AppStart,
        ISNULL(NULLIF(CHARINDEX('<br/><b>Access Level</b> : ', ColumnName), 0), LEN(ColumnName)+1) AS AppEnd,
        ISNULL(CHARINDEX('<br/><b>Access Level</b> : ', ColumnName) + LEN('<br/><b>Access Level</b> : '), 1) AS AccessStart,
        ISNULL(NULLIF(CHARINDEX('<br/><b>Restrictions</b> : ', ColumnName), 0), LEN(ColumnName)+1) AS AccessEnd,
        ISNULL(CHARINDEX('<br/><b>Restrictions</b> : ', ColumnName) + LEN('<br/><b>Restrictions</b> : '), 1) AS RestrictStart
    FROM TableName
)
SELECT
    NULLIF(SUBSTRING(ColumnName, AppStart, CASE WHEN AppEnd > AppStart THEN AppEnd - AppStart ELSE 0 END), '') AS [Application],
    NULLIF(SUBSTRING(ColumnName, AccessStart, CASE WHEN AccessEnd > AccessStart THEN AccessEnd - AccessStart ELSE 0 END), '') AS [Access Level],
    NULLIF(SUBSTRING(ColumnName, RestrictStart, CASE WHEN LEN(ColumnName) >= RestrictStart THEN LEN(ColumnName) - RestrictStart + 1 ELSE 0 END), '') AS [Restrictions]
FROM Positions

内容的提问来源于stack exchange,提问作者Malan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:27:02