在JSON数组中查找匹配项

时间:2019-11-13 15:11:10

标签: json sql-server

我有一个名为“ Interactions”的SQL表和一个名为Events的列,其中包含JSON数据数组。我正在寻找事件json具有@odata.type = #Sitecore.XConnect.Goal

的任何数组的任何行
[
   {
      "@odata.type":"#Sitecore.XConnect.Collection.Model.PageViewEvent",
      "CustomValues":[

      ],
      "DefinitionId":"9326cb1e-cec8-48f2-9a3e-91c7dbb2166c",
      "ItemId":"5ae02a76-ac59-4dbb-913f-3b2e51d92bae",
      "Id":"b067f72f-1d60-4773-a2e8-9d23770fea54",
      "Timestamp":"2019-11-11T17:18:31.2206225Z",
      "ItemLanguage":"en",
      "ItemVersion":1,
      "Url":"/renewal-confirmation",
      "SitecoreRenderingDevice":{
         "Id":"fe5d7fdf-89c0-4d99-9aa3-b5fbd009c9f3",
         "Name":"Default"
      }
   },
   {
      "@odata.type":"#Sitecore.XConnect.Goal",
      "CustomValues":[

      ],
      "DataKey":"/sitecore/content/Client/home/renewal-confirmation",
      "DefinitionId":"c0bc91b9-b5fc-4faa-bc12-3dba8bbae44f",
      "ItemId":"5ae02a76-ac59-4dbb-913f-3b2e51d92bae",
      "EngagementValue":100,
      "Id":"e7031fb4-ce57-459f-a9f1-2682748d3431",
      "ParentEventId":"b067f72f-1d60-4773-a2e8-9d23770fea54",
      "Timestamp":"2019-11-11T17:18:31.2518732Z"
   }
]

我目前正在尝试的是此方法,但没有结果

select *
from [Interactions] I
where exists
( 
  select * 
  from openjson(I.Events,'$."@odata.type"') 
  where value = '#Sitecore.XConnect.Goal'
)

如果使用此命令,则可以得到数组@odata.type = #Sitecore.XConnect.Goal中第一项的任何行。这可行。但是我想要数组中的任何项目。

SELECT *
FROM [Interactions]
WHERE JSON_VALUE([Events], '$[0]."@odata.type"') = '#Sitecore.XConnect.Goal'

2 个答案:

答案 0 :(得分:1)

一种可能的方法是使用带有明确架构(带有列定义的JSON子句)的OPENJSON()来解析WITH列。使用这种方法,您可以过滤Interactions表并从JSON数据中获取信息。

表格:

CREATE TABLE Interactions (
   Events nvarchar(max)
)
INSERT INTO Interactions
   (Events)
VALUES 
   (N'[
   {
      "@odata.type":"#Sitecore.XConnect.Collection.Model.PageViewEvent",
      "CustomValues":[

      ],
      "DefinitionId":"9326cb1e-cec8-48f2-9a3e-91c7dbb2166c",
      "ItemId":"5ae02a76-ac59-4dbb-913f-3b2e51d92bae",
      "Id":"b067f72f-1d60-4773-a2e8-9d23770fea54",
      "Timestamp":"2019-11-11T17:18:31.2206225Z",
      "ItemLanguage":"en",
      "ItemVersion":1,
      "Url":"/renewal-confirmation",
      "SitecoreRenderingDevice":{
         "Id":"fe5d7fdf-89c0-4d99-9aa3-b5fbd009c9f3",
         "Name":"Default"
      }
   },
   {
      "@odata.type":"#Sitecore.XConnect.Goal",
      "CustomValues":[

      ],
      "DataKey":"/sitecore/content/Client/home/renewal-confirmation",
      "DefinitionId":"c0bc91b9-b5fc-4faa-bc12-3dba8bbae44f",
      "ItemId":"5ae02a76-ac59-4dbb-913f-3b2e51d92bae",
      "EngagementValue":100,
      "Id":"e7031fb4-ce57-459f-a9f1-2682748d3431",
      "ParentEventId":"b067f72f-1d60-4773-a2e8-9d23770fea54",
      "Timestamp":"2019-11-11T17:18:31.2518732Z"
   }
]')

声明:

SELECT *
FROM Interactions i
CROSS APPLY OPENJSON(i.Events) WITH (
   ODataType nvarchar(100) '$."@odata.type"'
   -- and additional columns definitions 
) j
WHERE j.ODataType = '#Sitecore.XConnect.Goal'

答案 1 :(得分:1)

您的原始查询已结束,但是无法正常工作,因为您无法直接使用OPENJSON来选择标量。您想要这样的东西:

SELECT *
FROM [interactions]
WHERE EXISTS (
    SELECT 1
    FROM OPENJSON([events]) WITH (
        [@odata.type] NVARCHAR(MAX)
    )
    WHERE [@odata.type] = '#Sitecore.XConnect.Goal'
)