T-SQL如何将预提取JSON数组字符串的多个值拆分转换为多行
T-SQL 拆分JSON数组格式字段为多行的实现方法
适用场景
你提到的Group_ID字段存储的是标准JSON数组字符串,SQL Server 2016及以上版本可以直接用原生JSON函数处理,不需要额外做字符串清洗。
核心实现(SQL Server 2016+ 推荐方案)
用到OPENJSON函数解析JSON数组,搭配CROSS APPLY实现一行拆多行:
SELECT t.ID, j.value AS Group_ID FROM 你的源表名 t CROSS APPLY OPENJSON(t.Group_ID) j
说明
OPENJSON解析JSON数组后返回的value字段就是数组中的单个元素值,会自动去掉外层引号,不需要额外处理- 如果需要保留
Group_ID为空、或不是合法JSON数组的原行,把CROSS APPLY换成OUTER APPLY即可
效果示例
原表行:
| ID | Group_ID |
|---|---|
| 1 | ["def","hij"] |
| 2 | ["abc"] |
查询返回结果:
| ID | Group_ID |
|---|---|
| 1 | def |
| 1 | hij |
| 2 | abc |
低版本SQL Server兼容方案(2016以下无原生JSON支持)
先创建自定义拆分函数:
CREATE FUNCTION dbo.SplitGroupID(@GroupIDStr NVARCHAR(MAX)) RETURNS @Result TABLE (Value NVARCHAR(200)) AS BEGIN SET @GroupIDStr = TRIM('[]' FROM ISNULL(@GroupIDStr, '')) IF LEN(@GroupIDStr) = 0 RETURN DECLARE @SplitStr NVARCHAR(3) = '","' DECLARE @Start INT = 1, @Pos INT = CHARINDEX(@SplitStr, @GroupIDStr) WHILE @Pos > 0 BEGIN INSERT INTO @Result(Value) VALUES (REPLACE(SUBSTRING(@GroupIDStr, @Start, @Pos - @Start), '"', '')) SET @Start = @Pos + LEN(@SplitStr) SET @Pos = CHARINDEX(@SplitStr, @GroupIDStr, @Start) END INSERT INTO @Result(Value) VALUES (REPLACE(SUBSTRING(@GroupIDStr, @Start, LEN(@GroupIDStr) - @Start + 1), '"', '')) RETURN END GO
调用函数实现拆分:
SELECT t.ID, s.Value AS Group_ID FROM 你的源表名 t CROSS APPLY dbo.SplitGroupID(t.Group_ID) s
内容的提问来源于stack exchange,提问作者SUMguy
相关产品推荐
相关产品推荐

