sql >> Databáze >  >> RDS >> Sqlserver

Jak vrátit duplicitní klíče z dokumentu JSON na SQL Server

Pokud se pokoušíte extrahovat hodnoty z dokumentu JSON, ale jedna nebo více hodnot na stejné úrovni má duplicitní klíče, můžete narazit na problémy, pokud se pokusíte tyto hodnoty extrahovat pomocí JSON_QUERY() nebo JSON_VALUE() .

Obě tyto funkce vrátí pouze první hodnotu, která odpovídá cestě.

Naštěstí je tu ještě jedna možnost.

OPENJSON() funkce vrátí všechny hodnoty ze všech duplicitních klíčů na stejné úrovni.

Příklad

Zde je příklad demonstrující OPENJSON() vrací duplicitní vlastnosti na stejné úrovni.

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

Výsledek:

+-------+----------+--------+| klíč   | hodnota    | typ   ||-------+----------+--------|| jméno  | Načíst    | 1      || jméno  | Hodný pes | 1      || sex   | muž     | 1      |+-------+----------+--------+

Tento příklad vrátí všechny potomky $.dog.details klíč.

V tomto případě máme dva klíče se stejným názvem na stejné úrovni (name klíč).

Pokud bychom chtěli vrátit pouze hodnoty ze dvou name klíče, mohli bychom udělat něco takového.

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

Výsledek:

+-----------+| hodnota    ||----------|| Načíst    || Hodný pes |+----------+

JSON_VALUE() &JSON_QUERY()

Jak již bylo zmíněno, obě JSON_VALUE() a JSON_QUERY() vrátí pouze první hodnotu, která odpovídá cestě.

Pokud je tedy zkusíme použít proti výše uvedenému dokumentu JSON, dostaneme následující výsledky.

JSON_VALUE()

JSON_VALUE() vrátí skalární hodnotu z řetězce JSON, takže vrátí následující výsledek.

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

Výsledek:

+---------------+| JSON_VALUE   ||--------------|| Načíst        |+---------------+

JSON_QUERY()

JSON_QUERY() extrahuje objekt nebo pole z řetězce JSON, takže vrátí následující výsledek.

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

Výsledek:

+---------------+| JSON_QUERY   ||--------------|| {                "jméno" :"Aport",                 "jméno" :"Hodný pes",                "sex" :"muž"                          +                       "jméno" :"Dobrý pes",                "sex" :"muž"             -        -        -               - 

Alespoň s JSON_QUERY() vidíme duplicitní klíče, ale nezískáme jejich individuální hodnoty jako u OPENJSON() .


  1. Vložení připraveného příkazu do databáze - PSQL

  2. 3 Funkce, které získávají den, měsíc a rok z data v PostgreSQL

  3. 7 způsobů, jak může Microsoft Access pomoci vaší firmě

  4. Bezpečnostní sítě