Как разобрать Json в SQL - PullRequest
       5

Как разобрать Json в SQL

0 голосов
/ 08 января 2020

Я пытаюсь разобрать JSON с помощью функции OPENJSON с помощью CROSS APLY, но у меня есть некоторые проблемы.

Мой Json выглядит так:

 [
   {
      "Communications":[
         {
            "ID_Communication":null,
            "CommunicationType":"HOME",
            "CommunicationValue":"0602060206",
            "Priority":0,
            "Disabled":false
         },
         {
            "ID_Communication":null,
            "CommunicationType":"MOBILE",
            "CommunicationValue":"0602060306",
            "Priority":0,
            "Disabled":false
         },
         {
            "ID_Communication":null,
            "CommunicationType":"EMAIL",
            "CommunicationValue":"MONEMAIL@EMAIL.FR",
            "Priority":0,
            "Disabled":false
         }
      ],
      "InternalId":23126,
      "ExternalId":"",
      "LastUpdateDate":"2020-01-05T12:04:53",
      "Type1":{
         "Id":1
      },
      "Type2":{
         "Id":2
      },
      "Type3":null,
      "Title":{
         "Id":1
      },
      "LastName":"TOTO",
      "FirstName":"TITI",
      "OrganizationName":"",
      "Sex":"M",
      "BirthDate":"1959-10-07T00:00:00",
      "Adresses":[
         {
            "ID_Address":null,
            "Address1":"1 RUE DE FRANCE",
            "Address2":"",
            "Address3":"",
            "Address4":null,
            "ZipCode":"94500",
            "CityName":"MA VILLE",
            "Country":{
               "Id":"FR"
            },
            "Type":null,
            "State":null,
            "Priority":0,
            "ScopeId":0
         }
      ],
      "Language":{
         "Id":"FR"
      },
      "Comment":"",
      "PassportNumber":"",
      "IdentityCardNumber":"",
      "Nationality":null,
      "SocialGroup":{
         "Id":1
      },
      "OptIns":[
         {
            "OptInType":"OPT_CLUB",
            "OptInLabel":"Optin club",
            "OptInValue":0
         },
         {
            "OptInType":"OPT_PART",
            "OptInLabel":"Optin partenaires",
            "OptInValue":0
         }
      ],
      "WebLogin":"MONEMAIL@EMAIL.FR"
   }
]

Я попытался выполнить запрос, подобный следующему: Этот запрос пытается получить различную информацию об этом JSON.

declare @JSON_CONTACT nvarchar(MAX)

SELECT @JSON_CONTACT = '[
   {
      "Communications":[
         {
            "ID_Communication":null,
            "CommunicationType":"HOME",
            "CommunicationValue":"0602060206",
            "Priority":0,
            "Disabled":false
         },
         {
            "ID_Communication":null,
            "CommunicationType":"MOBILE",
            "CommunicationValue":"0602060306",
            "Priority":0,
            "Disabled":false
         },
         {
            "ID_Communication":null,
            "CommunicationType":"EMAIL",
            "CommunicationValue":"MONEMAIL@EMAIL.FR",
            "Priority":0,
            "Disabled":false
         }
      ],
      "InternalId":23126,
      "ExternalId":"",
      "LastUpdateDate":"2020-01-05T12:04:53",
      "Type1":{
         "Id":1
      },
      "Type2":{
         "Id":2
      },
      "Type3":null,
      "Title":{
         "Id":1
      },
      "LastName":"TOTO",
      "FirstName":"TITI",
      "OrganizationName":"",
      "Sex":"M",
      "BirthDate":"1959-10-07T00:00:00",
      "Adresses":[
         {
            "ID_Address":null,
            "Address1":"1 RUE DE FRANCE",
            "Address2":"",
            "Address3":"",
            "Address4":null,
            "ZipCode":"94500",
            "CityName":"MA VILLE",
            "Country":{
               "Id":"FR"
            },
            "Type":null,
            "State":null,
            "Priority":0,
            "ScopeId":0
         }
      ],
      "Language":{
         "Id":"FR"
      },
      "Comment":"",
      "PassportNumber":"",
      "IdentityCardNumber":"",
      "Nationality":null,
      "SocialGroup":{
         "Id":1
      },
      "OptIns":[
         {
            "OptInType":"OPT_CLUB",
            "OptInLabel":"Optin club",
            "OptInValue":0
         },
         {
            "OptInType":"OPT_PART",
            "OptInLabel":"Optin partenaires",
            "OptInValue":0
         }
      ],
      "WebLogin":"MONEMAIL@EMAIL.FR"
   }
]'

DROP TABLE TEMP_JSON_RCT_TEST_PARSE

SELECT *
INTO TEMP_JSON_RCT_TEST_PARSE   
FROM OPENJSON (@JSON_CONTACT)
WITH (  
        FIRSTNAME nvarchar(50) '$.FirstName',
        LASTNAME nvarchar(50) '$.LastName',
        Sex nvarchar(2) '$.Sex',
        BirthDate date  '$.BirthDate',
        Communications nvarchar(max) AS JSON
) AS Communications
CROSS APPLY OPENJSON(Communications)
WITH (
    CommunicationType  nvarchar(50),
    CommunicationValue nvarchar(50),
    Adresses nvarchar(max) AS JSON
) AS Adresses
CROSS APPLY OPENJSON(Adresses)
WITH (
    Address1 nvarchar(100)
)

Я хотел бы получить возвращаемое значение:

FIRSTNAME, LASTNAME, SEX, BIRTHDATE, EMAIL, MOBILE, HOME, LASTUPDATEDATE, ADDRESS1, ADRESSE2, ADDRESSE3, ADDRESS4, ZIPCODE, CITYNAME, OPT_CLUB, OPT_PART

VALUES:
MY FIRSTNAME, MYLASTNAME, M, 09/05/1989, MONEMAIL@EMAIL.FR, 0602060306,0602060206, 2020-01-05T12:04:53, 1 RUE DE FRANCE, , , , 94500, MA VILLE, 0, 0

Когда я выполняю свой запрос, который возвращает ноль, я не понимаю, почему.

Можете ли вы помочь с этим?

Ответы [ 2 ]

0 голосов
/ 08 января 2020

Это, кажется, возвращает ожидаемые результаты, но обратите внимание, что это работает, только если массивы OptIns и Communications JSON имеют структуру в вопросе. Вам необходимо использовать OPENJSON() с явной схемой и предложением AS JSON для вложенных массивов JSON:

SELECT 
   FIRSTNAME, LASTNAME, SEX, BIRTHDATE, 
   EMAIL, MOBILE, HOME, 
   LASTUPDATEDATE, ADDRESS1, ADDRESS2, ADDRESS3, ADDRESS4, ZIPCODE, CITYNAME,
   OPT_CLUB, OPT_PART
FROM OPENJSON(@JSON_CONTACT, '$') WITH (
   FIRSTNAME nvarchar(100) '$.FirstName',
   LASTNAME nvarchar(100) '$.LastName',
   SEX nvarchar(1) '$.Sex',
   BIRTHDATE nvarchar(100) '$.BirthDate',
   Communications nvarchar(max) '$.Communications' AS JSON,
   Adresses nvarchar(max) '$.Adresses' AS JSON,
   LASTUPDATEDATE nvarchar(100) '$.LastUpdateDate',
   OptIns nvarchar(max) '$.OptIns' AS JSON
) j1
CROSS APPLY (
   SELECT
      MAX(CASE WHEN CommunicationType = 'EMAIL' THEN CommunicationValue END) AS EMAIL,
      MAX(CASE WHEN CommunicationType = 'MOBILE' THEN CommunicationValue END) AS MOBILE,
      MAX(CASE WHEN CommunicationType = 'HOME' THEN CommunicationValue END) AS HOME
   FROM OPENJSON(j1.Communications) WITH (
      CommunicationType nvarchar(100) '$.CommunicationType',
      CommunicationValue nvarchar(100) '$.CommunicationValue'
   )   
) j2
CROSS APPLY OPENJSON(j1.Adresses) WITH (
   ADDRESS1 nvarchar(100) '$.Address1',
   ADDRESS2 nvarchar(100) '$.Address2',
   ADDRESS3 nvarchar(100) '$.Address3',
   ADDRESS4 nvarchar(100) '$.Address4',
   ZIPCODE nvarchar(100) '$.ZipCode',
   CITYNAME nvarchar(100) '$.CityName'
) j3
CROSS APPLY (
   SELECT
      MAX(CASE WHEN OptInType = 'OPT_CLUB' THEN OptInValue END) AS OPT_CLUB,
      MAX(CASE WHEN OptInType = 'OPT_PART' THEN OptInValue END) AS OPT_PART
   FROM OPENJSON(j1.OptIns) WITH (
      OptInType nvarchar(100) '$.OptInType',
      OptInValue int '$.OptInValue'
   )   
) j4

Результат (с JOSN в вопросе):

FIRSTNAME   LASTNAME    SEX BIRTHDATE           EMAIL               MOBILE      HOME        LASTUPDATEDATE      ADDRESS1        ADDRESS2    ADDRESS3    ADDRESS4    ZIPCODE CITYNAME    OPT_CLUB    OPT_PART
TITI        TOTO        M   1959-10-07T00:00:00 MONEMAIL@EMAIL.FR   0602060306  0602060206  2020-01-05T12:04:53 1 RUE DE FRANCE                                     94500   MA VILLE    0           0
0 голосов
/ 08 января 2020

Адрес является частью основного объекта

SELECT *
FROM OPENJSON (@JSON_CONTACT)
WITH (  
        FIRSTNAME nvarchar(50) '$.FirstName',
        LASTNAME nvarchar(50) '$.LastName',
        Sex nvarchar(2) '$.Sex',
        BirthDate date  '$.BirthDate',
        Communications nvarchar(max) AS JSON,
        Adresses nvarchar(max) AS JSON
) AS Communications
CROSS APPLY OPENJSON(Communications)
WITH (
    CommunicationType  nvarchar(50),
    CommunicationValue nvarchar(50)    
) AS Adresses
CROSS APPLY OPENJSON(Adresses)
WITH (
    Address1 nvarchar(100)
)
...