SQL Server JSON Array - PullRequest
       13

SQL Server JSON Array

0 голосов
/ 05 октября 2018

У меня есть какой-то JSON, который я хотел бы проанализировать в SQL Server 2016. Существует иерархическая структура с массивами.Я хотел бы написать запрос, который более эффективно анализирует всю иерархию, у меня возникают проблемы при попытке получить доступ к встроенным массивам, особенно к чему-либо из « DealerPrefLocation », хотя у меня нет проблем с доступом к чему-либо из «DealerInformation», нижемой пример JSON:

        {
            "DealerInformation": {
                "Altername": [
                    {
                        "firstName": "two",
                        "lastName": "one",
                        "middleName": null,
                        "otherNameExplanation": "change"
                    }
                ],
                "DealerType": {
                    "id": "87ab-098ng-2345li",
                    "name": "DMD"
                },
                "firstName": "PK",
                "middleName": null,
                "lastName": "KPK",
                "primaryDealerState": "AP",
                "otherDealerState": [
                    "AP",
                    "MP"]
            },
            "DealerPrefLocation": [
                {
                    "PrefLocation": [
                        {
                            "address": {
                                "address1": "fort warangal",
                                "address2": "east",
                                "addressStandardizationSource": null,
                                "city": "warangal",
                                "country": "India"
                            },
                            "apptPhoneNumber": "989898989898",
                            "createdAt": null,
                            "phoneNumber": "989898989898"
                        }
                    ],
                    "NonPrefLocation": [
                        {
                            "address": {
                                "address1": "fort Junction",
                                "address2": null,
                                "addressStandardizationSource": null
                            },
                            "createdAt": null,
                            "ServiceName": "H1",
                            "ServiceId": [
                                {
                                    "ServiceGroupName": null,
                                    "Type": "GROUP",
                                    "ServiceNumber": "9999999"
                                }
                            ]
                        }
                    ],
                    "Inserted": null,
                    "Updated": null     }
            ]
        }

Я выяснил, как запрашивать «DealerInformation» и массивы внутри него, такие как «AlterName» и «OtherDealerState», однако у меня есть проблемы с запросом массивов в «DealerInformation» ->«PrefLocation» -> Address.

Пожалуйста, найдите мой текущий запрос и выходные данные:

select 
  ID,
  JSON_VALUE(VALUE_ID,'$.DealerInformation.firstName'),
  JSON_VALUE(VALUE_ID,'$.DealerInformation.primaryDealerState'),
  JSON_VALUE(A.VALUE,'$.firstName'),
  JSON_VALUE(C.VALUE,'$.PrefLocation.address.address1')
from 
  Test_JSON_File 
cross apply 
  openjson(Test_JSON_File.value_id,'$.DealerInformation.Altername')A 
cross apply 
  openjson(Test_JSON_File.Test_JSON_CAQH.value_id,'$.DealerPrefLocation')C

Последний выбранный мной столбец из "DealerPrefLocation", но я получаю только нули, может кто-то помочьчто мне не хватает в SQL или что мне нужно добавить?

1 Ответ

0 голосов
/ 09 октября 2018

Извините, этот ответ довольно поздно ...

Я думаю, самая важная информация для вас - это AS JSON в WITH -пункте.Посмотрите, как я его использую:

DECLARE @json NVARCHAR(MAX) =   
N' {
            "DealerInformation": {
                "Altername": [
                    {
                        "firstName": "two",
                        "lastName": "one",
                        "middleName": null,
                        "otherNameExplanation": "change"
                    }
                ],
                "DealerType": {
                    "id": "87ab-098ng-2345li",
                    "name": "DMD"
                },
                "firstName": "PK",
                "middleName": null,
                "lastName": "KPK",
                "primaryDealerState": "AP",
                "otherDealerState": [
                    "AP",
                    "MP"]
            },
            "DealerPrefLocation": [
                {
                    "PrefLocation": [
                        {
                            "address": {
                                "address1": "fort warangal",
                                "address2": "east",
                                "addressStandardizationSource": null,
                                "city": "warangal",
                                "country": "India"
                            },
                            "apptPhoneNumber": "989898989898",
                            "createdAt": null,
                            "phoneNumber": "989898989898"
                        }
                    ],
                    "NonPrefLocation": [
                        {
                            "address": {
                                "address1": "fort Junction",
                                "address2": null,
                                "addressStandardizationSource": null
                            },
                            "createdAt": null,
                            "ServiceName": "H1",
                            "ServiceId": [
                                {
                                    "ServiceGroupName": null,
                                    "Type": "GROUP",
                                    "ServiceNumber": "9999999"
                                }
                            ]
                        }
                    ],
                    "Inserted": null,
                    "Updated": null     }
            ]
        }';

- я выберу хотя бы один элемент из каждого региона.Это должно указать вам путь:

SELECT B.firstName
      ,B.middleName
      ,B.lastName
      ,JSON_VALUE(B.DealerType,'$.id') AS DealerTypeId
      ,B.PrimaryDealerState
      ,B.otherDealerState                                          --You can dive deeper to parse that array
      ,JSON_VALUE(B.Altername,'$[0].firstName') AS Alter_firstName --there might be more...
      ,JSON_VALUE(C.PrefLocation,'$[0].address.address1') AS pref_address --there might be more...
      ,JSON_VALUE(C.PrefLocation,'$[0].apptPhoneNumber') AS pref_apptPhoneNumber
      ,JSON_VALUE(C.NonPrefLocation,'$[0].address.address1') AS nonpref_address --there might be more...
      ,JSON_VALUE(C.NonPrefLocation,'$[0].ServiceName') AS nonpref_ServiceName
FROM OPENJSON(@json)
WITH(DealerInformation NVARCHAR(MAX) AS JSON
    ,DealerPrefLocation NVARCHAR(MAX) AS JSON) A
OUTER APPLY OPENJSON(A.DealerInformation)
WITH(Altername NVARCHAR(MAX) AS JSON
    ,DealerType NVARCHAR(MAX) AS JSON
    ,firstName NVARCHAR(MAX)
    ,DealerType NVARCHAR(MAX) AS JSON
    ,middleName NVARCHAR(MAX)
    ,lastName NVARCHAR(MAX)
    ,primaryDealerState NVARCHAR(MAX)
    ,otherDealerState NVARCHAR(MAX) AS JSON) B
OUTER APPLY OPENJSON(A.DealerPrefLocation) 
WITH(PrefLocation NVARCHAR(MAX) AS JSON
    ,NonPrefLocation NVARCHAR(MAX) AS JSON) C

ОБНОВЛЕНИЕ Выберите из таблицы

Попробуйте это

SELECT B.firstName
      ,B.middleName
      ,B.lastName
      ,JSON_VALUE(B.DealerType,'$.id') AS DealerTypeId
      ,B.PrimaryDealerState
      ,B.otherDealerState                                          --You can dive deeper to parse that array
      ,JSON_VALUE(B.Altername,'$[0].firstName') AS Alter_firstName --there might be more...
      ,JSON_VALUE(C.PrefLocation,'$[0].address.address1') AS pref_address --there might be more...
      ,JSON_VALUE(C.PrefLocation,'$[0].apptPhoneNumber') AS pref_apptPhoneNumber
      ,JSON_VALUE(C.NonPrefLocation,'$[0].address.address1') AS nonpref_address --there might be more...
      ,JSON_VALUE(C.NonPrefLocation,'$[0].ServiceName') AS nonpref_ServiceName
FROM Test_JSON_File 
CROSS APPLY OPENJSON(value_id)
WITH(DealerInformation NVARCHAR(MAX) AS JSON
    ,DealerPrefLocation NVARCHAR(MAX) AS JSON) A
OUTER APPLY OPENJSON(A.DealerInformation)
WITH(Altername NVARCHAR(MAX) AS JSON
    ,DealerType NVARCHAR(MAX) AS JSON
    ,firstName NVARCHAR(MAX)
    ,DealerType NVARCHAR(MAX) AS JSON
    ,middleName NVARCHAR(MAX)
    ,lastName NVARCHAR(MAX)
    ,primaryDealerState NVARCHAR(MAX)
    ,otherDealerState NVARCHAR(MAX) AS JSON) B
OUTER APPLY OPENJSON(A.DealerPrefLocation) 
WITH(PrefLocation NVARCHAR(MAX) AS JSON
    ,NonPrefLocation NVARCHAR(MAX) AS JSON) C;
...