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

SQL如何拆分varchar类型genre列中的{xxxxxx}格式元素?

解决SQL Server中拆分{xxxxxx}格式元素的问题

直接用STRING_SPLIT(genres, '}')拆分的核心问题是:拆分后会丢失闭合的},且如果元素间存在逗号、空格等分隔符,结果会混入多余内容。以下是几种针对性的解决方法:

方法1:STRING_SPLIT结合字符串清理

假设你的genre列数据格式类似{Action},{Drama},{Comedy},可以先拆分再过滤补全:

SELECT 
    -- 提取纯分类名称
    TRIM('{}, ' FROM value) AS genre_name,
    -- 重新组装成完整的{xxxxxx}格式
    '{' + TRIM('{}, ' FROM value) + '}' AS formatted_genre
FROM your_table
CROSS APPLY STRING_SPLIT(genre, '}')
-- 过滤拆分后产生的空行
WHERE TRIM('{}, ' FROM value) <> ''

拆分后每个value会是{Action,、{Drama,这类内容,通过TRIM清理首尾多余字符,再按需还原完整格式。

方法2:利用OPENJSON解析(SQL Server 2016+)

通过格式转换将原数据转为JSON数组,再用OPENJSON精准提取元素:

SELECT 
    '{' + JSON_VALUE(value, '$') + '}' AS formatted_genre
FROM your_table
-- 将{Action},{Drama}转换为["Action","Drama"]格式的JSON数组
CROSS APPLY OPENJSON('["' + REPLACE(REPLACE(genre, '{', '["'), '}', '"]') + ']')
WHERE JSON_VALUE(value, '$') <> ''

这种方式无需处理拆分后的残留字符,直接获取完整的{xxxxxx}元素。

方法3:自定义拆分函数(兼容低版本SQL Server)

如果你的SQL Server版本低于2016(不支持STRING_SPLIT),可以创建自定义函数直接提取完整元素:

CREATE FUNCTION dbo.SplitGenre(@genre VARCHAR(MAX))
RETURNS @Result TABLE (FormattedGenre VARCHAR(100))
AS
BEGIN
    DECLARE @Start INT = 1, @End INT
    WHILE @Start <= LEN(@genre)
    BEGIN
        -- 定位每个}的位置
        SET @End = CHARINDEX('}', @genre, @Start)
        IF @End = 0 BREAK
        -- 提取从{到}的完整元素
        INSERT INTO @Result VALUES(SUBSTRING(@genre, @Start, @End - @Start + 1))
        SET @Start = @End + 1
    END
    RETURN
END

使用方式:

SELECT FormattedGenre
FROM your_table
CROSS APPLY dbo.SplitGenre(genre)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 14:16:23