索引和查询JSON数组

时间:2019-08-09 21:31:54

标签: sql-server azure-sql-database

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

2 个答案:

答案 0 :(得分:1)

当您要查询JSON数组或对象时,应使用JSON_QUERY来设计。 JSON_VALUE旨在返回标量,因此,如果您将JSON_VALUE与地址,值甚至从属关系一起使用(在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 

答案 1 :(得分:1)

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