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
相关产品推荐
相关产品推荐

