簡體   English   中英

SQL JSON - 從數組中獲取特定值

[英]SQL JSON - Get specific values from an array

我正在嘗試從 JSON 字符串中的數組以及數組外的其他值中獲取 2 個特定值。 到目前為止,我已經設法通過使用 where 子句從數組中獲取 1 個特定值。 但不,我被困住了。 我不知道如何獲得其他值,因為我不能使用 2 where 子句? 所以也許有人指出我正確的方向?

數組“標識符”有幾個值,但我只想要 type: code 為 1881591 和 1881495 的值。

這是我正在使用的 SQL 查詢

DECLARE @json NVARCHAR(MAX)
 
SET @json = N'{"response":[{"partyId":"aa343434","prid":"88228822","partyName":"MyCompany",
              "addresses":[{"type":{"code":"1879539","description":"Operating Address"},"addressLine1":"Myaddress 4","addressLine2":"C/O xxx","addressLine3":"","addressLine4":"",
              "city":"yyy","state":{"code":"","description":""},"country":{"code":"1865641","description":"Denmark"},"postalCode":"2222","postalPlusCode":""}],
              "identifiers":[{"type":{"code":"1881600","description":"Bank IBAN"},"value":"888343434"},{"type":{"code":"1881591","description":"DUNS"},"value":"123456789"},{"type":{"code":"1881495","description":"NAT ID - DENMARK CVR NUMBER"},"value":"12345678"}],
              "sourceSystem":"source"},{"partyId":"aa343434","prid":"88228822","partyName":"MyNewCompany",
              "addresses":[{"type":{"code":"1879539","description":"Operating Address"},"addressLine1":"MyOtheraddress 23","addressLine2":"C/O zzz","addressLine3":"","addressLine4":"",
              "city":"zzz","state":{"code":"","description":""},"country":{"code":"1865641","description":"Denmark"},"postalCode":"3333","postalPlusCode":""}],
              "identifiers":[{"type":{"code":"1881591","description":"DUNS"},"value":"987654321"},{"type":{"code":"1881495","description":"NAT ID - DENMARK CVR NUMBER"},"value":"87654321"},
              {"type":{"code":"1881590","description":"CESID"},"value":"22334466"}],
              "sourceSystem":"source"}]}'

SELECT partyname, DUNS, addressLine1, addressLine2, city, country, postalcode FROM OPENJSON(@json, 'strict $.response') 
WITH (
      partyName NVARCHAR(255),
      addresses NVARCHAR(MAX) AS JSON,
      identifiers NVARCHAR(MAX) AS JSON
     )
CROSS APPLY OPENJSON(addresses)
WITH (
      addressLine1 NVARCHAR(255),
      addressLine2 NVARCHAR(255),
      city NVARCHAR(255),
      country NVARCHAR(255) 'strict $.country.description',
      postalCode NVARCHAR(255)
     )
CROSS APPLY OPENJSON(identifiers)
WITH (
      typecode NVARCHAR(255) 'strict $.type.code',
      DUNS NVARCHAR(255) 'strict $.value'
     )
WHERE typecode = '1881591'

這會給我以下結果: 在此處輸入圖像描述

但我正在尋找的是: 在此處輸入圖像描述

最好的問候奧萊

SELECT partyname, tps.DUNS, tps.CVR, addressLine1, addressLine2, city, country, postalcode 
FROM OPENJSON(@json, 'strict $.response') 
WITH (
      partyName NVARCHAR(255),
      addresses NVARCHAR(MAX) AS JSON,
      identifiers NVARCHAR(MAX) AS JSON
     )
CROSS APPLY OPENJSON(addresses)
WITH (
      addressLine1 NVARCHAR(255),
      addressLine2 NVARCHAR(255),
      city NVARCHAR(255),
      country NVARCHAR(255) 'strict $.country.description',
      postalCode NVARCHAR(255)
     )
CROSS APPLY
(
    SELECT 
        MAX(CASE WHEN id.typedescription = 'DUNS' THEN id.typevalue END) AS DUNS,
        MAX(CASE WHEN id.typedescription = 'NAT ID - DENMARK CVR NUMBER' THEN id.typevalue END) AS CVR
    FROM OPENJSON(identifiers)
    WITH 
    (
          typecode NVARCHAR(255) 'strict $.type.code',
          typedescription NVARCHAR(255) 'strict $.type.description',
          typevalue NVARCHAR(255) 'strict $.value'
    ) AS id    
) AS tps

如果我理解正確,您可以使用條件聚合將這些移動到單獨的列:

SELECT partyname, \addressLine1, addressLine2, city, country, postalcode, d.*
FROM OPENJSON(@json, 'strict $.response') 
WITH (
      partyName NVARCHAR(255),
      addresses NVARCHAR(MAX) AS JSON,
      identifiers NVARCHAR(MAX) AS JSON
     )
CROSS APPLY OPENJSON(addresses)
WITH (
      addressLine1 NVARCHAR(255),
      addressLine2 NVARCHAR(255),
      city NVARCHAR(255),
      country NVARCHAR(255) 'strict $.country.description',
      postalCode NVARCHAR(255)
     )
CROSS APPLY
    (SELECT MAX(CASE WHEN typecode = '1881591' THEN DUNS END) duns_1881591,
            MAX(CASE WHEN typecode = '1881495' THEN DUNS END) duns_1881495
     FROM OPENJSON(identifiers)
          WITH (typecode NVARCHAR(255) 'strict $.type.code',
                DUNS NVARCHAR(255) 'strict $.value'
               )
      WHERE typecode IN ( '1881591', '1881495')
     ) d

是一個 db<>fiddle。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM