Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server JSON数组的索引和查询_Sql Server_Azure Sql Database - Fatal编程技术网

Sql server JSON数组的索引和查询

Sql server JSON数组的索引和查询,sql-server,azure-sql-database,Sql Server,Azure Sql Database,我将类似这样的JSON值存储在一个表中: { "properties":[ { "address":{ "value":"A3", "name":"", "prop":"", "path":[ "RealOptionsList9293" ], "type":"local

我将类似这样的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()
?如果我使用它,我应该使用物化视图吗?

当您想要查询JSON数组或对象时,您应该使用设计用于此操作的
JSON\u query
JSON_值
被设计为返回标量,因此,如果将
JSON_值
与地址、值甚至依赖项(在JSON中)一起使用,它将始终返回null。但如果将其与save一起使用,它将返回其值

所以,你需要做的是这样的:

SELECT 
    JSON_VALUE([Address],'$.value') 
FROM (
SELECT 
    JSON_QUERY(@json,'$.properties[0].address')  AS [Address]
,   JSON_QUERY(@json,'$.properties[0].value')  AS [Value]
,   JSON_QUERY(@json,'$.properties[0].dependents')  AS [dependents]

) arrays 

如果要查询
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'

在我的例子中,properties数组中的元素数是一个变量。上述方法不起作用,因为您可能有一个或多个元素。@frosty上述方法适用于您提供的示例。如果json比这更复杂,那么json_查询就应该做到这一点。