2

I have some JSON that I would like to parse in SQL Server 2016. There is a hierarchy structure with arrays. I would like to write a query that parses the whole hierarchy more efficiently, I have challenges trying to access embedded arrays especially anything under "DealerPrefLocation", while I have no problems accessing anything under "DealerInformation", below is my sample 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     }
            ]
        }

I did figure out how to query "DealerInformation" and arrays within it such as "AlterName" and "OtherDealerState", however I have challenges querying arrays under "DealerInformation"-->"PrefLocation"-->Address.

Please find my current query and output:

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

The last column I selected is from "DealerPrefLocation" but I get only nulls, can someone help what am I missing in the SQL or what do I need to add?

1 Answer 1

1

Sorry, this answer is rather late...

I think, the most important information for you is the AS JSON within the WITH-clause. See how I use it:

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     }
            ]
        }';

--I'll pick at least one element out of each region. This should point you the way:

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

UPDATE Select out of a table

Try this

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;
Sign up to request clarification or add additional context in comments.

2 Comments

Thank you very much, how can I apply this syntax against my table? Can you help please, in this case its acting against variable value, but I have my data in column called "value_id" in a table called "Test_JSON_File"
Thank you very much Shnugo, just one more question please, is there way I can simply query without need of mentioning the index of the array ? Thinking in the lines of automation and I can just write query without any index numbers and get back all values in arrays.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.