在SQL Server 2017中将所有带有属性的JSON值和属性作为列返回

问题描述 投票:0回答:1

使用一个只有两列的表的简单示例 - 一个id和一个长JSON字符串 - 如何使用属性作为列轻松返回所有JSON值和属性?

我知道我可以随时使用JSON_VALUE并指定一个特定的键/属性,但我不想为每个可能的键都有很多JSON_VALUE列表。有这种动态的方式吗?

比方说,我有100个JSON密钥,结果应该是一个id列,另有100个密钥列及其值?

谢谢。

json tsql sql-server-2016 sql-server-2017
1个回答
0
投票

如果您的JSON对象只是键级值对的一级列表,则可以调用OPENJSON

DECLARE @mockup TABLE(Id INT, SomeJSON NVARCHAR(MAX));

INSERT INTO @mockup VALUES
 (1,N'{"key1":"value1","key2":"value2"}')
,(2,N'{"key1":"value1","key5":"value5"}')
,(3,N'{"keyA":"valueA","keyB":"valueB","keyZ":"valueZ"}');

SELECT t.Id
      ,A.*
FROM @mockup t
CROSS APPLY OPENJSON(t.SomeJSON) A;

结果

1   key1    value1  1
1   key2    value2  1
2   key1    value1  1
2   key5    value5  1
3   keyA    valueA  1
3   keyB    valueB  1
3   keyZ    valueZ  1

要以表格格式并排获取,您可以使用PIVOT,条件聚合或 - 可能是最好的 - WITH子句:

SELECT t.Id
      ,A.*
FROM @mockup t
CROSS APPLY OPENJSON(t.SomeJSON) 
WITH(key1 NVARCHAR(10)
    ,key2 NVARCHAR(10)
    ,key5 NVARCHAR(10)
    ,keyA NVARCHAR(10)
    ,keyB NVARCHAR(10)
    ,keyZ NVARCHAR(10)
    ) A;

结果

Id  key1    key2    key5    keyA    keyB    keyZ
1   value1  value2  NULL    NULL    NULL    NULL
2   value1  NULL    value5  NULL    NULL    NULL
3   NULL    NULL    NULL    valueA  valueB  valueZ

在任何情况下,您必须提前知道所有可能的密钥。此方法允许最佳命名,您可以指定适当的类型。

如果您事先不知道所有密钥,可以查看动态SQL。您可以使用上面的语句来读取所有键并动态创建拟合语句/ WITH子句。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.