Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak zwrócić zduplikowane klucze z dokumentu JSON w SQL Server

Jeśli próbujesz wyodrębnić wartości z dokumentu JSON, ale jedna lub więcej wartości na tym samym poziomie ma zduplikowane klucze, możesz napotkać problemy, jeśli spróbujesz wyodrębnić te wartości za pomocą JSON_QUERY() lub JSON_VALUE() .

Obie te funkcje zwrócą tylko pierwszą wartość, która pasuje do ścieżki.

Na szczęście jest inna opcja.

OPENJSON() funkcja zwróci wszystkie wartości z dowolnych zduplikowanych kluczy na tym samym poziomie.

Przykład

Oto przykład demonstrujący OPENJSON() zwraca zduplikowane właściwości na tym samym poziomie.

DECLARE @json NVARCHAR(4000) = N'{
    "dog" : {
            "details" : {
                "name" : "Fetch", 
                "name" : "Good Dog",
                "sex" : "male"
            }
        }
    }';
SELECT * FROM OPENJSON(@json, '$.dog.details'); 

Wynik:

+-------+----------+--------+| klucz   | wartość    | wpisz ||-------+----------+--------|| nazwa  | Pobierz    | 1      || nazwa  | Dobry Pies | 1      || seks   | mężczyzna     | 1      |+-------+----------+------------+

Ten przykład zwraca wszystkie dzieci $.dog.details klawisz.

W tym przypadku mamy dwa klucze o tej samej nazwie na tym samym poziomie (name klawisz).

Gdybyśmy chcieli zwrócić tylko wartości z dwóch name klawisze, moglibyśmy zrobić coś takiego.

DECLARE @json NVARCHAR(4000) = N'{
    "dog" : {
            "details" : {
                "name" : "Fetch", 
                "name" : "Good Dog",
                "sex" : "male"
            }
        }
    }';
SELECT value FROM OPENJSON(@json, '$.dog.details')
WHERE [key] = 'name'; 

Wynik:

+----------+| wartość    ||----------|| Pobierz    || Dobry pies |+----------+

JSON_VALUE() &JSON_QUERY()

Jak wspomniano, zarówno JSON_VALUE() i JSON_QUERY() zwraca tylko pierwszą wartość, która pasuje do ścieżki.

Więc jeśli spróbujemy użyć ich przeciwko powyższemu dokumentowi JSON, otrzymamy następujące wyniki.

JSON_VALUE()

JSON_VALUE() zwraca wartość skalarną z ciągu JSON, więc zwróci następujący wynik.

DECLARE @json NVARCHAR(4000) = N'{
    "dog" : {
            "details" : {
                "name" : "Fetch", 
                "name" : "Good Dog",
                "sex" : "male"
            }
        }
    }';
SELECT JSON_VALUE(@json, '$.dog.details.name') AS [JSON_VALUE]; 

Wynik:

+--------------+| JSON_VALUE   ||--------------|| Pobierz        |+--------------+

JSON_QUERY()

JSON_QUERY() wyodrębnia obiekt lub tablicę z ciągu JSON, więc zwróci następujący wynik.

DECLARE @json NVARCHAR(4000) = N'{
    "dog" : {
            "details" : {
                "name" : "Fetch", 
                "name" : "Good Dog",
                "sex" : "male"
            }
        }
    }';
SELECT JSON_QUERY(@json, '$.dog.details') AS [JSON_QUERY]; 

Wynik:

+--------------+| JSON_QUERY   ||--------------|| [ 

Przynajmniej z JSON_QUERY() widzimy zduplikowane klucze, ale nie otrzymujemy ich indywidualnych wartości, jak w przypadku OPENJSON() .


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak skutecznie modelować dziedziczenie w bazie danych?

  2. Jak zlokalizować zadania agenta programu SQL Server w Azure Data Studio

  3. SQL Server ORDER BY data i wartości null trwają

  4. Odwołaj się do aliasu w innym miejscu na liście WYBIERZ

  5. Jak mogę uzyskać listę nazw elementów z wartości XML w SQL Server?