sql >> Databasteknik >  >> RDS >> MariaDB

MariaDB JSON_VALUE() vs JSON_QUERY():Vad är skillnaden?

I MariaDB, JSON_VALUE() funktion och JSON_QUERY() funktion gör liknande saker – de returnerar data från ett JSON-dokument.

Så vad är skillnaden?

Den största skillnaden är att JSON_VALUE() returnerar skalära värden, medan JSON_QUERY() returnerar arrayer och objekt.

Definitioner

Med ett JSON-dokument gör varje funktion följande:

  • JSON_VALUE() returnerar den skalär som anges av sökvägen.
  • JSON_QUERY() returnerar ett objekt eller en matris som anges av sökvägen.

Min uppfattning är att det fungerar på detta sätt på grund av SQL-standarden.

Om detta orsakar problem för dig kanske du hittar JSON_EXTRACT() funktion mer användbar.

Skalärer

Här är ett exempel för att visa vad som händer när vi försöker använda båda funktionerna för att extrahera en skalär från ett JSON-dokument.

SET @json_document = '
    { 
        "name" : "Rufus",
        "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] 
    }
';
SELECT 
    JSON_VALUE(@json_document, '$.name') AS JSON_VALUE,
    JSON_QUERY(@json_document, '$.name') AS JSON_QUERY;

Resultat:

+------------+------------+
| JSON_VALUE | JSON_QUERY |
+------------+------------+
| Rufus      | NULL       |
+------------+------------+

JSON_VALUE() returnerade skalären som förväntat, men JSON_QUERY() returnerade NULL . Detta förväntas eftersom JSON_QUERY() returnerar endast arrayer och objekt.

Det är samma resultat om vi försöker returnera skalär data från arrayen:

SET @json_document = '
    { 
        "name" : "Rufus",
        "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] 
    }
';
SELECT 
    JSON_VALUE(@json_document, '$.awards[0]') AS JSON_VALUE,
    JSON_QUERY(@json_document, '$.awards[0]') AS JSON_QUERY;

Resultat:

+------------+------------+
| JSON_VALUE | JSON_QUERY |
+------------+------------+
| Top Dog    | NULL       |
+------------+------------+

Objekt

Här är vad som händer när vi försöker använda båda funktionerna för att returnera ett helt objekt:

SET @json_document = '{ "name" : "Rufus" }';

SELECT 
    JSON_VALUE(@json_document, '$') AS JSON_VALUE,
    JSON_QUERY(@json_document, '$') AS JSON_QUERY;

Resultat:

+------------+----------------------+
| JSON_VALUE | JSON_QUERY           |
+------------+----------------------+
| NULL       | { "name" : "Rufus" } |
+------------+----------------------+

Den här gången är det JSON_QUERY() funktion som lyckas.

Arrayer

Här är vad som händer när vi försöker använda båda funktionerna för att returnera en hel array:

SET @json_document = '
    { 
        "name" : "Rufus",
        "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] 
    }
';
SELECT 
    JSON_VALUE(@json_document, '$.awards') AS JSON_VALUE,
    JSON_QUERY(@json_document, '$.awards') AS JSON_QUERY;

Resultat:

+------------+------------------------------------------+
| JSON_VALUE | JSON_QUERY                               |
+------------+------------------------------------------+
| NULL       | [ "Top Dog", "Best Dog", "Biggest Dog" ] |
+------------+------------------------------------------+

Återigen, JSON_QUERY() funktionen lyckas.

Ingen av funktionerna lyckas dock när vi använder array-jokerteckenoperatorn för att välja alla skalära element från arrayen. I det här fallet, JSON_EXTRACT() kommer till undsättning:

SET @json_document = '
    { 
        "name" : "Rufus",
        "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] 
    }
';
SELECT 
    JSON_VALUE(@json_document, '$.awards[*]') AS JSON_VALUE,
    JSON_QUERY(@json_document, '$.awards[*]') AS JSON_QUERY,
    JSON_EXTRACT(@json_document, '$.awards[*]') AS JSON_EXTRACT;

Resultat:

+------------+------------+----------------------------------------+
| JSON_VALUE | JSON_QUERY | JSON_EXTRACT                           |
+------------+------------+----------------------------------------+
| Top Dog    | NULL       | ["Top Dog", "Best Dog", "Biggest Dog"] |
+------------+------------+----------------------------------------+

Men om arrayens element är arrayer eller objekt, då JSON_QUERY() returnerar dem fint:

SET @json_document = '
    { 
        "name" : "Rufus",
        "scores" : [ [1, 2, 3], [8, 9], { "a" : 1 } ] 
    }
';
SELECT 
    JSON_VALUE(@json_document, '$.scores') AS JSON_VALUE,
    JSON_QUERY(@json_document, '$.scores') AS JSON_QUERY;

Resultat:

+------------+------------------------------------+
| JSON_VALUE | JSON_QUERY                         |
+------------+------------------------------------+
| NULL       | [ [1, 2, 3], [8, 9], { "a" : 1 } ] |
+------------+------------------------------------+

  1. Hur skapar jag ett steg i mitt SQL Server Agent Job som kör mitt SSIS-paket?

  2. Skapa PostgreSQL-databas i farten med Hibernate även om DB inte finns

  3. Naturlig koppling i SQL Server

  4. 2 sätt att returnera rader som innehåller icke-alfanumeriska tecken i PostgreSQL