sql >> Databasteknik >  >> RDS >> Mysql

JSON_VALUE() i MySQL

I MySQL, JSON_VALUE() funktion extraherar ett värde från ett JSON-dokument på den angivna sökvägen.

Funktionen introducerades i MySQL 8.0.21.

Syntax

Syntaxen ser ut så här:

JSON_VALUE(json_doc, path [RETURNING type] [on_empty] [on_error])

Var:

on_empty:
    {NULL | ERROR | DEFAULT value} ON EMPTY

on_error:
    {NULL | ERROR | DEFAULT value} ON ERROR

Exempel

Här är ett enkelt exempel att visa:

SELECT JSON_VALUE( '{ "name" : "Wag", "type" : "Dog" }', '$.type' );

Resultat:

Dog

Arrayer

Här är ett exempel på att få ett värde från en array:

SELECT JSON_VALUE( '{ "name" : "Wag", "scores" : [ 25, 36, 48 ] }', '$.scores[1]' );

Resultat:

36

Matriser är nollbaserade, så 1 returnerar det andra elementet (0 skulle returnera den första).

Inbäddade dokument

Här är ett exempel på att få ett värde från ett inbäddat objekt:

SELECT JSON_VALUE(
    '{ 
        "_id" : 1, 
        "details" : { 
            "name" : "Wag",
            "type" : "Dog"
            } 
    }', 
    '$.details.type' 
    );

Resultat:

Dog

Returtyp

Här är ett exempel på hur du anger returtypen:

SELECT JSON_VALUE(
    '{ 
        "_id" : 1, 
        "details" : { 
            "name" : "Wag",
            "type" : "Dog"
            } 
    }', 
    '$.details' RETURNING json
    );

Resultat:

{"name": "Wag", "type": "Dog"}

Om du inte anger returtypen är returtypen VARCHAR(512) .

Tömma resultat

Som standard, om ingen data hittas på den angivna sökvägen, NULL returneras:

SELECT JSON_VALUE(
    '{ 
        "name" : "Wag",
        "type" : "Dog"
    }', 
    '$.score'
    );

Resultat:

NULL

Följande alternativ kan dock användas för att explicit specificera vad som ska hända när ingen data hittas på den givna sökvägen:

  • NULL ON EMPTY :Funktionen returnerar NULL; detta är standardbeteendet.
  • DEFAULT value PÅ TOM :det angivna value returneras. Värdets typ måste matcha returtypen.
  • ERROR ON EMPTY :Funktionen ger ett fel.

Exempel:

SELECT JSON_VALUE(
    '{ 
        "name" : "Wag",
        "type" : "Dog"
    }', 
    '$.score' 
    DEFAULT 'Nothing found' ON EMPTY
    );

Resultat:

Nothing found

Fel

Följande kan användas för att specificera vad som händer när ett fel uppstår:

  • NULL ON ERROR :JSON_VALUE() returnerar NULL; detta är standardbeteendet.
  • DEFAULT value PÅ FEL :Detta är värdet som returneras; dess värde måste matcha returtypens värde.
  • ERROR ON ERROR :Ett fel uppstår.

Om den används, ON EMPTY måste föregå alla ON ERROR klausul. Att ange dem i fel ordning resulterar i ett syntaxfel.

Index

Som nämnts i MySQL 8.0.21 release notes, JSON_VALUE() funktionen förenklar skapandet av index på JSON kolumner. Ett anrop till JSON_VALUE(json_doc , path RETURNERAR type ) motsvarar att anropa CAST( JSON_UNQUOTE( JSON_EXTRACT(json_doc , path ) ) AS type ) .

Här är exemplet som används i versionskommentarerna:

CREATE TABLE inventory(
    items JSON,
    INDEX i1 ( (JSON_VALUE(items, '$.name' RETURNING CHAR(50))) ),
    INDEX i2 ( (JSON_VALUE(items, '$.price' RETURNING DECIMAL(5,2))) ),
    INDEX i3 ( (JSON_VALUE(items, '$.quantity' RETURNING UNSIGNED)) )
);

  1. Hur hämtar jag alla rader i min DB?

  2. PostgreSQL-fel när du försöker skapa ett tillägg

  3. Får du använda siffror som tabellnamn i MySQL?

  4. Hur man slumpmässigt ställer in text till knappar från SQLite utan upprepning?