【问题标题】:Return All JSON Values and Attributes with Attributes as Columns in SQL Server 2017在 SQL Server 2017 中以列形式返回所有 JSON 值和属性
【发布时间】:2019-09-18 12:44:46
【问题描述】:

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

我知道我可以很容易地使用 JSON_VALUE 并指定一个特定的键/属性,但我不希望每个可能的键都有大量 JSON_VALUE 的长列表。有没有一种动态的方式来做到这一点?

比如说,我有 100 个 JSON 键,结果应该是一个 id 列,还有另外 100 个键列及其值?

谢谢。

【问题讨论】:

    标签: json tsql sql-server-2016 sql-server-2017


    【解决方案1】:

    如果您的 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 子句。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-28
      • 1970-01-01
      • 2010-12-24
      相关资源
      最近更新 更多