如何使用json_query在json中拆分数组?

时间:2019-06-06 09:48:54

标签: tsql

我在json表中有一列。它仅包含不带键的值,例如

enter image description here

现在我正在尝试从json拆分数据并使用每个数组的每个索引作为新条目(如

)创建新表

enter image description here

我已经尝试过

SELECT JSON_QUERY(abc) as 'Type', Id as 'ValueId' from Table FOR JSON AUTO

鉴于某些数组可能为空且看起来像

,有什么方法可以处理拆分?
[]

2 个答案:

答案 0 :(得分:2)

一种相当简单的方法是将outer applyopenjson一起使用。

首先,创建并填充示例表(在您将来的问题中为我们保存此步骤):

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);