我在json表中有一列。它仅包含不带键的值,例如
现在我正在尝试从json拆分数据并使用每个数组的每个索引作为新条目(如
)创建新表我已经尝试过
SELECT JSON_QUERY(abc) as 'Type', Id as 'ValueId' from Table FOR JSON AUTO
鉴于某些数组可能为空且看起来像
,有什么方法可以处理拆分?[]
?
答案 0 :(得分:2)
一种相当简单的方法是将outer apply
与openjson
一起使用。
首先,创建并填充示例表(请在您将来的问题中为我们保存此步骤):
DECLARE @T AS TABLE
(
Id int,
Value nvarchar(20)
)
INSERT INTO @T VALUES
(1, '[10]'),
(2, '[20, 200]'),
(3, '[]'),
(4, '')
查询:
SELECT Id, JsonValues.Value
FROM @T As t
OUTER APPLY
OPENJSON( Value ) As JsonValues
WHERE ISJSON(t.Value) = 1
结果:
Id Value
1 10
2 20
2 200
3 NULL
请注意,ISJSON
子句中的where
条件将防止出现异常,以防Value
列包含有效json以外的任何内容(仍然考虑使用空数组[]
为此有效)。
如果您不想返回json数组为空的行,请使用cross apply
而不是outer apply
。
答案 1 :(得分:0)
您自己的调用FOR JSON AUTO
的代码尝试使用表格数据创建JSON。但是您真正需要的似乎是相反的方向:您想将JSON转换为结果集,即派生表。这是由OPENJSON
完成的。
您的JSON似乎是一个非常简单的数组。
您可以尝试一下。
DECLARE @json NVARCHAR(MAX) =N'[1,2,3]';
SELECT * FROM OPENJSON(@json);
结果返回key
中的从零开始的序数位置,value
中的实际值和(非常有限的)类型枚举。
提示:如果要针对表的列使用此提示,则必须使用APPLY
,
SELECT *
FROM YourTable t
OUTER APPLY OPENJSON(t.TheJsonColumn);