【问题标题】:SQL Server : SELECT JSON Column in this JSON StructureSQL Server:在此 JSON 结构中选择 JSON 列
【发布时间】:2020-09-14 17:14:35
【问题描述】:

我想知道是否可以从以下 JSON 结构中选择数据?

 [
    {
        "A": 6, 
        "Status": 1
    },
    {
        "A": 3, 
        "Status": 0
    },
    {
        "A": 6, 
        "Status": 1
    },
    {
        "A": 7, 
        "Status": 0
    }
]

根据这个link,数组/对象之前有Property。

"EmployeeInfo": {  
        "FirstName":"Jignesh",  
        "LastName":"Trivedi",  
        "Code":"CCEEDD",  
        "Addresses": [  
            { "Address":"Test 0", "City":"Gandhinagar", "State":"Gujarat"},  
            { "Address":"Test 1", "City":"Gandhinagar", "State":"Gujarat"}  
        ]  
    } 

例如,(从上面的链接获取示例),我们看到查询以属性EmployeeInfo 开始,这样查询就可以在此查询中获取数据。

SELECT JSON_VALUE(@JSONData, '$.EmployeeInfo.FirstName')

所以我只是无法弄清楚如何从上面提供的结构中实现这一点,任何人都可以向我指出一些有用的示例代码。谢谢。

【问题讨论】:

    标签: sql-server json-query json-value


    【解决方案1】:

    您有两个选项来解析这个 JSON 数组:

    • OPENJSON() 与显式架构一起使用一次 - 以获取每个项目的内容
    • 使用OPENJSON() 两次 - 获取每个项目的索引和内容

    JSON:

    DECLARE @json varchar(max) = '
    [
        {
            "A": 6, 
            "Status": 1
        },
        {
            "A": 3, 
            "Status": 0
        },
        {
            "A": 6, 
            "Status": 1
        },
        {
            "A": 7, 
            "Status": 0
        }
    ]'
    

    OPENJSON() 与显式架构一起使用一次:

    SELECT A, Status
    FROM OPENJSON(@json) WITH (
       A int,
       Status int
    )
    

    结果:

    A   Status
    6   1
    3   0
    6   1
    7   0
    

    使用OPENJSON() 两次:

    SELECT 
       j1.[key] AS Index,
       j2.A, j2.Status
    FROM OPENJSON(@json) j1
    CROSS APPLY OPENJSON(j1.[value]) WITH (
       A int,
       Status int
    ) j2 
    

    结果:

    Index   A   Status
    0       6   1
    1       3   0
    2       6   1
    3       7   0
    

    当然,您总是可以通过索引访问数组项:

    SELECT 
       JSON_QUERY(@json, '$[0]') AS Item,
       JSON_VALUE(@json, '$[0].A') AS A, 
       JSON_VALUE(@json, '$[0].Status') AS Status
    

    结果:

    Item                   A    Status
    {"A": 6, "Status": 1}  6    1
    

    【讨论】:

      【解决方案2】:

      类似的东西

      declare @json nvarchar(max) =N'
      [
          {
              "A": 6, 
              "Status": 1
          },
          {
              "A": 3, 
              "Status": 0
          },
          {
              "A": 6, 
              "Status": 1
          },
          {
              "A": 7, 
              "Status": 0
          }
      ]'
      
      select * from openjson(@json) with (A       int,
                                          Status  int);
      

      输出

      A   Status
      6   1
      3   0
      6   1
      7   0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-30
        • 1970-01-01
        • 2017-01-31
        • 2022-01-23
        • 2018-04-23
        • 1970-01-01
        • 2022-12-02
        • 1970-01-01
        相关资源
        最近更新 更多