Использование cross apply для запроса вложенных массивов в json - PullRequest
0 голосов
/ 02 января 2019

У меня, вероятно, довольно простой запрос, но я не могу понять, как запрашивать вложенные массивы json. У меня есть база данных SQL 2016 с полем json, которое содержит строку json с несколькими дочерними массивами.

Прикрепленное изображение данных json:

enter image description here

Я хотел бы запросить «идентификационные» данные (99999829250103)

Я могу запросить данные, такие как accountId (LOADACC001) или псевдоним (LoadTest), используя следующий запрос, но не могу сделать запрос из массива account:

   SELECT top 1
      accountId as NonUserAccountId
   FROM [DBName].DBSchema.transactions t
   CROSS APPLY OPENJSON (t.BankDataText, N'$.data')
   WITH 
   ( 
         accountId VARCHAR(100) 'strict $.account.accountId'
   )
   where t.Id = 675

Поле «BankDataText» содержит строку json, а таблица называется «транзакции». когда я добавляю еще один CROSS APPLY к запросу, строки не возвращаются.

1 Ответ

0 голосов
/ 04 января 2019

Вы на правильном пути, вам просто нужно извлечь вложенный раздел json с помощью as json, а затем использовать другой cross apply с open json для чтения внутреннего раздела account:

declare @tmp table ([id] int, BankDataText nvarchar(max))
declare @j nvarchar(max)='{
    "data": [{
        "account": {
            "account": [{
                "schemaName": "SortCodeAccountNumber",
                "identification": "99999829250103",
                "name": "Load testing ....",
                "secondaryIdentification": "123456789"
            }],
            "accountType": "null",
            "accountSubType": "null",
            "description": null,
            "accountId": "LOADACC001",
            "currency": "GBP",
            "nickname": "LoadTest",
            "servicer": {
                "schemaName": "BICFI",
                "identification": "PAPAUK00XXX"
            }
        }
    }]
}'
insert into @tmp select 675, @j

select top 1
    A.accountId as NonUserAccountId,        B.identification
from @tmp t
    cross apply openjson (t.BankDataText, N'$.data') with
    ( 
        accountId varchar(100)  'strict $.account.accountId',
        account   nvarchar(max) 'strict $.account.account' as json 
    ) A
    cross apply openjson(A.account) with 
    ( 
        identification varchar(100)
    ) B

Результат:

enter image description here

...