sql >> Database >  >> RDS >> MariaDB

MariaDB JSON_VALUE() versus JSON_QUERY():wat is het verschil?

In MariaDB, de JSON_VALUE() functie en JSON_QUERY() functie vergelijkbare dingen doen - ze retourneren gegevens uit een JSON-document.

Dus wat is het verschil?

Het belangrijkste verschil is dat JSON_VALUE() geeft scalaire waarden terug, terwijl JSON_QUERY() geeft arrays en objecten terug.

Definities

Met een JSON-document doet elke functie het volgende:

  • JSON_VALUE() geeft de scalaire waarde terug die door het pad is gespecificeerd.
  • JSON_QUERY() retourneert een object of array gespecificeerd door het pad.

Ik heb begrepen dat het op deze manier werkt vanwege de SQL-standaard.

Als dit problemen voor u veroorzaakt, vindt u mogelijk de JSON_EXTRACT() functie nuttiger.

Scalaren

Hier is een voorbeeld om te laten zien wat er gebeurt als we beide functies proberen te gebruiken om een ​​scalair uit een JSON-document te extraheren.

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;

Resultaat:

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

JSON_VALUE() heeft de scalaire waarde geretourneerd zoals verwacht, maar JSON_QUERY() NULL geretourneerd . Dit wordt verwacht, omdat JSON_QUERY() retourneert alleen arrays en objecten.

Het is hetzelfde resultaat als we proberen scalaire gegevens uit de array te retourneren:

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;

Resultaat:

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

Objecten

Dit is wat er gebeurt als we beide functies proberen te gebruiken om een ​​heel object te retourneren:

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

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

Resultaat:

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

Deze keer is het de JSON_QUERY() functie die slaagt.

Arrays

Dit is wat er gebeurt als we beide functies proberen te gebruiken om een ​​hele array te retourneren:

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;

Resultaat:

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

Nogmaals, de JSON_QUERY() functie slaagt.

Geen van beide functies slaagt echter wanneer we de array-jokertekenoperator gebruiken om alle scalaire elementen uit de array te selecteren. In dit geval is de JSON_EXTRACT() komt te hulp:

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;

Resultaat:

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

Als de elementen van de array echter arrays of objecten zijn, dan JSON_QUERY() geeft ze goed terug:

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;

Resultaat:

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

  1. Leg uit Plan Kosten Pijnpunt

  2. Hoe krijg ik tekstuele inhoud van BLOB in Oracle SQL?

  3. Hoe voer je een SQLite-query uit binnen een Android-applicatie?

  4. Een pleidooi houden voor reguliere SQL Server-services