首页 > 解决方案 > 索引和查询 JSON 数组

问题描述

我将这样的 JSON 值存储在一个表中:

{  
   "properties":[  
      {  
         "address":{  
            "value":"A3",
            "name":"",
            "prop":"",
            "path":[  
               "RealOptionsList9293"
            ],
            "type":"local"
         },
         "value":{  
            "type":11,
            "value":"portland"
         },
         "dependents":[  

         ],
         "save":true
      }
   ]
}

我想索引 address.value 和 value.value 以便我可以查询它们。MSDN 示例适用于使用计算列的基本属性。它不包括索引数组。可以在数组上进行索引吗?任何示例都会有所帮助。

我想查询具有以下内容的行:

JSON_VALUE(mycolumn, '$.properties[*].address.value') = 'A3'
AND JSON_VALUE(mycolumn, $.properties[*].value.value) = 'portland'

我没有看到[*]语法。我应该OPENJSON()改用吗?如果我使用它,我应该使用物化视图吗?

标签: sql-serverazure-sql-database

解决方案


如果要查询一个JSON数组,OPENJSON()比较合适:

桌子:

CREATE TABLE #Data (
   JsonData nvarchar(max)
)
INSERT INTo #Data (JsonData)
VALUES (N'{  
   "properties":[  
      {  
         "address":{  
            "value":"A3",
            "name":"",
            "prop":"",
            "path":[  
               "RealOptionsList9293"
            ],
            "type":"local"
         },
         "value":{  
            "type":11,
            "value":"portland"
         },
         "dependents":[  

         ],
         "save":true
      },
      {  
         "address":{  
            "value":"A4",
            "name":"",
            "prop":"",
            "path":[  
               "RealOptionsList9293"
            ],
            "type":"local"
         },
         "value":{  
            "type":11,
            "value":"portland"
         },
         "dependents":[  

         ],
         "save":true
      }
   ]
}')

陈述:

SELECT d.*
FROM #Data d
CROSS APPLY OPENJSON(d.JsonData, '$.properties') WITH (
   AddressValue nvarchar(1000) '$.address.value',
   ValueValue nvarchar(1000) '$.value.value'
) j
WHERE j.AddressValue = 'A3' AND ValueValue = 'portland'

推荐阅读