【问题标题】:SQL Query on Json object inside multiple JSON objects对多个 JSON 对象内的 Json 对象进行 SQL 查询
【发布时间】:2020-04-17 10:03:57
【问题描述】:

我有下面的 Json 字符串。我需要编写一个查询来获取 TP 记录。在不提供索引值的情况下,我们需要得到结果。

{
   "S": [
    {
      "Name": "Project1",
      "SP": [
       {
          "ID": 1,
          "Name": "Test1",
          "TP": [
            {
              "TID": 11,
              "TName": "TT1",
            },
            {
              "TID": 12,
              "TName": "TT2",
            },
         ]
      },
      {
        "ID": 2,
        "Name": "Test2",
        "TP": [
         {
          "TID": 13,
          "TName": "TT3",
         },
         {
          "TID": 14,
          "TName": "TT4",
         },
       ]
    },
  ]}]}

如何查询TP值。

预期结果:

  TID    TName 
  11     TT1 
  12     TT2
  13     TT3
  14     TT4

【问题讨论】:

  • 我使用的是 SQL Server 2019

标签: sql json sql-server sql-server-2019 open-json


【解决方案1】:

您可以使用包含WITH 子句的OPENJSON 函数添加尽可能多的CROSS APPLY 子句来查看所有子数组:

SELECT S3.TID, S3.TName
  FROM tab
 CROSS APPLY OPENJSON(JsonData)
             WITH ( S  nvarchar(max) '$.S' AS JSON) AS S0
 CROSS APPLY OPENJSON (S0.S) 
             WITH (
                    SP nvarchar(max) '$.SP' AS JSON ) S1
 CROSS APPLY OPENJSON (S1.SP) 
             WITH (
                    TP nvarchar(max) '$.TP' AS JSON ) S2
 CROSS APPLY OPENJSON (S2.TP) 
             WITH (
                    TID   nvarchar(500) '$.TID', 
                    TName nvarchar(500) '$.TName' ) S3

Demo

更新:如果第一个数组S被固定为只包含一个项目,我们可以减少一步为

SELECT S3.TID, S3.TName
  FROM tab
 CROSS APPLY OPENJSON(JsonData)
             WITH (
                    SP nvarchar(max) '$.S[0].SP' AS JSON ) S1
 CROSS APPLY OPENJSON (S1.SP) 
             WITH (
                    TP nvarchar(max) '$.TP' AS JSON ) S2
 CROSS APPLY OPENJSON (S2.TP) 
             WITH (
                    TID   nvarchar(500) '$.TID', 
                    TName nvarchar(500) '$.TName' ) S3  

Demo

【讨论】:

  • 有什么简单的方法来计算?在上面的Json中,SP记录为1,TP记录为4。
  • 好吧,我不知道更简单的方法,难以处理 S、SP、TP ,数组从哪个开始,因此,我们无法组合 $.S.SP.TP 等路径一步@AshokYaganti。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-28
  • 1970-01-01
  • 1970-01-01
  • 2022-11-05
  • 1970-01-01
  • 2012-09-04
  • 2015-07-03
相关资源
最近更新 更多