sql >> Database teknologi >  >> RDS >> MariaDB

MariaDB JSON_VALUE() vs JSON_QUERY():Hvad er forskellen?

I MariaDB er JSON_VALUE() funktion og JSON_QUERY() funktion gør lignende ting - de returnerer data fra et JSON-dokument.

Så hvad er forskellen?

Den største forskel er, at JSON_VALUE() returnerer skalære værdier, hvorimod JSON_QUERY() returnerer arrays og objekter.

Definitioner

Givet et JSON-dokument gør hver funktion følgende:

  • JSON_VALUE() returnerer den skalar, der er angivet af stien.
  • JSON_QUERY() returnerer et objekt eller et array angivet af stien.

Min forståelse er, at det fungerer på denne måde på grund af SQL-standarden.

Hvis dette forårsager problemer for dig, kan du muligvis finde JSON_EXTRACT() funktion mere nyttig.

Skalarer

Her er et eksempel for at demonstrere, hvad der sker, når vi forsøger at bruge begge funktioner til at udtrække en skalar fra et 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() returnerede skalaren som forventet, men JSON_QUERY() returnerede NULL . Dette forventes, fordi JSON_QUERY() returnerer kun arrays og objekter.

Det er det samme resultat, hvis vi forsøger at returnere skalardata fra arrayet:

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       |
+------------+------------+

Objekter

Her er, hvad der sker, når vi forsøger at bruge begge funktioner til at returnere et 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" } |
+------------+----------------------+

Denne gang er det JSON_QUERY() funktion, der lykkes.

Arrays

Her er, hvad der sker, når vi forsøger at bruge begge funktioner til at returnere et helt 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" ] |
+------------+------------------------------------------+

Igen, JSON_QUERY() funktionen lykkes.

Ingen af ​​funktionerne lykkes dog, når vi bruger array-jokertegnoperatoren til at vælge alle skalære elementer fra arrayet. I dette tilfælde er JSON_EXTRACT() kommer til undsætning:

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 hvis arrayets elementer er arrays eller objekter, så JSON_QUERY() returnerer 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. Sådan fejler eller crasher dine MySQL-instanser til test

  2. Oracle PL/SQL:Dynamisk SQL-eksempel ved hjælp af Execute Immediate

  3. Sådan ekskluderer du poster med bestemte værdier i sql select

  4. MINUTE() Eksempler – MySQL