Работа с массивами JSON в SQL - PullRequest
0 голосов
/ 18 мая 2018

Я новичок в JSON, и разработчики сказали, что системы, в которых я использую SSRS / Query from, теперь будут содержать массивы JSON.

Я немного подобрал его через статьи MSDN /несколько здесь, но я хотел бы знать, есть ли более эффективный или более простой способ достичь того, что я пытаюсь.

Все, что я хочу сделать, это подсчитать, сколько раз "Несоблюдение" происходит внутримассив (это может быть 1 или более раз в зависимости от отправленной формы, поэтому никогда не фиксированная сумма)

Вот то, с чем я работаю;

  DECLARE @json NVARCHAR(4000) = N'{


"FormId": "3eb068fe-77c3-4f95-99fc-8313c00ce768",
  "FormName": "Test Form",
  "FormVersion": 1.0,
  "Sections": [
    {
      "Id": "36e612c9-9113-48a7-9415-c9b7200e7376",
      "Name": "General Details Section",
      "Title": "General",
      "Fields": [
        {
          "Id": "a4cedad6-483b-4b42-b42e-12f048b5474e",
          "Label": "Was the Job Done Safely?",
          "ValueDataType": "System.String",
          "Value": "No",
          "SubFields": [
            {
              "Id": "36593287-bbc4-42cd-914a-eef93a85c6d7",
              "Label": "What has been done to resolve this?",
              "ValueDataType": "System.String",
              "Value": "TEST"
            },
            {
              "Id": "49164866-3afe-4842-aa6f-85312fd3d558",
              "Label": "When was this Resolved?",
              "ValueDataType": "System.DateTime",
              "Value": "2018-05-04T00:00:00+01:00"
            }
          ]
        }
      ]
    },
    {
      "Id": "7b2e4eb9-6f2c-422b-a9fd-c813df293aa5",
      "Name": "Works Review",
      "Title": "Works Review",
      "Fields": [
        {
          "Id": "04a0c54b-7de5-4a14-8ee5-75dade12bfe4",
          "Label": "Is the Reinstatement correct?",
          "ValueDataType": "System.String",
          "Value": "Non Compliant",
          "SubFields": [
            {
              "Id": "36593287-bbc4-42cd-914a-eef93a85c6d7",
              "Label": "What has been done to resolve this?",
              "ValueDataType": "System.String",
              "Value": "TEST"
            },
            {
              "Id": "49164866-3afe-4842-aa6f-85312fd3d558",
              "Label": "When was this Resolved?",
              "ValueDataType": "System.DateTime",
              "Value": "2018-05-04T00:00:00+01:00"
            }
          ]
        },
        {
          "Id": "93b4e405-921c-48b3-9dc4-8a1363fb09c9",
          "Label": "Is the SLG correct on site?",
          "ValueDataType": "System.String",
          "Value": "Non Compliant",
          "SubFields": [
            {
              "Id": "a7847ef3-c413-4a3e-8b6c-2fef4085f77c",
              "Label": "What has been done to resolve this?",
              "ValueDataType": "System.String",
              "Value": "TEST"
            },
            {
              "Id": "18af548a-3ac5-46e6-ac27-a68232d5670a",
              "Label": "When was this Resolved?",
              "ValueDataType": "System.DateTime",
              "Value": "2018-05-04T00:00:00+01:00"
            },
            {
              "Id": "9107d373-4207-4e58-9a85-22e466a2c4c7",
              "Label": "How many Barriers are on site?",
              "ValueDataType": "System.Decimal",
              "Value": 4.0
            }
          ]
        }
      ]
    }
  ]
}';

    SELECT *
FROM OPENJSON(@json,'$.Sections[1].Fields[0]') a
CROSS APPLY OPENJSON(@json, '$.Sections') b

Как вы можете видеть, я 'я учусь шагать в данные, но есть ли лучший способ проверить сразу несколько «Разделов» и «Полей», чтобы получить данные, которые я ищу?

Спасибо за ваше время.

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Боюсь, ваш собственный ответ - совпадение ... Попробуйте:

    SELECT [a].*
          ,[b].value
          ,JSON_VALUE([b].value,N'$.Value') AS TheValueWithinField
    FROM OPENJSON(@json,N'$.Sections') [a]
    OUTER APPLY OPENJSON(a.value, N'$.Fields') [b]

Вы можете погрузиться в Sections, а затем использовать возвращенный объект в a.value, чтобы погрузиться глубже в Fields,Наконец, используйте JSON_VALUE, чтобы получить Value.Против этого вы можете использовать простой WHERE

0 голосов
/ 18 мая 2018

Я ответил на свой вопрос, я думаю;

SELECT COUNT(*)
FROM
        (
        SELECT [a].[value]
        FROM OPENJSON(@json,'$.Sections[1].Fields[0]') [a]
        CROSS APPLY OPENJSON(@json, '$.Sections') [b]
        ) [a]
WHERE [value] = 'Non Compliant'

Если есть более эффективные способы, пожалуйста, дайте мне знать, и я обновлю ответ (немного обновил код и в вопросе)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...