sql >> Databasteknik >  >> RDS >> MariaDB

MariaDB JSON_SET() Förklarad

I MariaDB, JSON_SET() är en inbyggd funktion som uppdaterar eller infogar data i ett JSON-dokument och returnerar resultatet.

JSON_SET() kan uppdatera och infoga data, medan JSON_INSERT() kan bara infoga data och JSON_REPLACE() kan bara uppdatera data.

Syntax

Syntaxen ser ut så här:

JSON_SET(json_doc, path, val[, path, val] ...)

Var:

  • json_doc är JSON-dokumentet.
  • path är sökvägen till elementet för vilket data ska infogas eller uppdateras värdet på.
  • val är det nya värdet.

Exempel

Här är ett exempel att visa.

SET @json = '
    { 
        "name" : "Wag", 
        "type" : "Cat" 
    }
';

SELECT JSON_SET(@json, '$.type', 'Dog');

Resultat:

+----------------------------------+
| JSON_SET(@json, '$.type', 'Dog') |
+----------------------------------+
| {"name": "Wag", "type": "Dog"}   |
+----------------------------------+

I det här fallet uppdaterade jag värdet för type medlem Cat till Dog .

Arrayelement

För att uppdatera eller infoga ett matriselement, ange elementets index:

SET @json = '
    { 
        "name" : "Wag", 
        "scores" : [8, 0, 9] 
    }
';

SELECT JSON_SET(@json, '$.scores[1]', 7);

Resultat:

+--------------------------------------+
| JSON_SET(@json, '$.scores[1]', 7)    |
+--------------------------------------+
| {"name": "Wag", "scores": [8, 7, 9]} |
+--------------------------------------+

I det här fallet uppdaterades det andra matriselementet med det nya värdet. Arrayer är nollbaserade, och så $.scores[1] hänvisar till det andra elementet i arrayen.

Infoga data

De tidigare exemplen uppdaterade befintliga data. Här är ett exempel på att infoga ny data:

SET @json = '
    { 
        "name" : "Wag", 
        "type" : "Dog" 
    }
';

SELECT JSON_SET(@json, '$.weight', 10);

Resultat:

+----------------------------------------------+
| JSON_SET(@json, '$.weight', 10)              |
+----------------------------------------------+
| {"name": "Wag", "type": "Dog", "weight": 10} |
+----------------------------------------------+

Här infogade vi ett nytt nyckel/värdepar ("weight": 10 ).

Nedan är ett exempel på hur du lägger till ett nytt element i en array:

SET @json = '
    { 
        "name" : "Wag", 
        "scores" : [8, 0, 9] 
    }
';

SELECT JSON_SET(@json, '$.scores[3]', 7);

Resultat:

+-----------------------------------------+
| JSON_SET(@json, '$.scores[3]', 7)       |
+-----------------------------------------+
| {"name": "Wag", "scores": [8, 0, 9, 7]} |
+-----------------------------------------+

Det här arrayexemplet kan också göras med JSON_ARRAY_INSERT() eller JSON_ARRAY_APPEND() .

Flera vägar

Syntaxen gör det möjligt att ställa in/uppdatera värden på flera vägar med ett enda anrop till JSON_SET() .

Exempel:

SET @json = '
    { 
        "name" : "Scratch", 
        "type" : "Rat"
    }
';

SELECT JSON_SET(@json, '$.type', 'Cat', '$.weight', 10);

Resultat:

+--------------------------------------------------+
| JSON_SET(@json, '$.type', 'Cat', '$.weight', 10) |
+--------------------------------------------------+
| {"name": "Scratch", "type": "Cat", "weight": 10} |
+--------------------------------------------------+

I nästa exempel infogar vi ett nytt värde i en array och uppdaterar ett annat:

SET @json = '{ "scores" : [ 0, 1, 2 ] }';

SELECT 
    JSON_SET(
        @json, 
        '$.scores[1]', "a", 
        '$.scores[3]', "b"
    ) AS Result;

Resultat:

+------------------------------+
| Result                       |
+------------------------------+
| {"scores": [0, "a", 2, "b"]} |
+------------------------------+

Nollargument

Om json_doc eller någon av path argument är null , resultatet är NULL . Men om value argumentet är null , då ersätts värdet till null .

SELECT 
    JSON_SET(null, '$.a', 1) AS a,
    JSON_SET('{"a":1}', null, 1) AS b,
    JSON_SET('{"a":1}', '$.a', null) AS c;

Resultat:

+------+------+-------------+
| a    | b    | c           |
+------+------+-------------+
| NULL | NULL | {"a": null} |
+------+------+-------------+

I följande exempel saknas ett av sökvägsargumenten i varje anrop till JSON_SET() . I båda fallen är resultatet NULL :

SET @json = '
    { 
        "name" : "Wag", 
        "type" : "Cat" 
    }
';

SELECT 
    JSON_SET(@json, null, 'Bark', '$.type', 'Dog') AS a,
    JSON_SET(@json, '$.name', 'Bark', null, 'Dog') AS b;

Resultat:

+------+------+
| a    | b    |
+------+------+
| NULL | NULL |
+------+------+

Felaktig parameterräkning

Anropar JSON_SET() utan argument resulterar i ett fel:

SELECT JSON_SET();

Resultat:

ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_SET'

Det är samma sak när inte tillräckligt många argument skickas:

SELECT JSON_SET('{"a":1}');

Resultat:

ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_SET'

  1. Hur kan jag använda en PostgreSQL-utlösare för att lagra ändringar (SQL-satser och radändringar)

  2. SQL Välja från två tabeller med inre koppling och limit

  3. MySQL Show Grants för alla användare

  4. Hur använder man en variabel för databasnamnet i T-SQL?