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

MariaDB JSON_REMOVE() Forklaret

I MariaDB, JSON_REMOVE() er en indbygget funktion, der fjerner data fra et JSON-dokument og returnerer resultatet.

Syntaks

Syntaksen ser sådan ud:

JSON_REMOVE(json_doc, path[, path] ...)

Eksempel

Her er et eksempel til at demonstrere.

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

SELECT JSON_REMOVE(@json, '$.type');

Resultat:

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

I dette tilfælde fjernede vi datamedlemmet type fra dokumentet. Med andre ord, type nøglen og dens tilhørende værdi blev fjernet.

Arrays

JSON_REMOVE() kan bruges til at fjerne hele arrayet eller specifikke elementer i arrayet.

For at fjerne hele arrayet skal du blot bruge nøglenavnet:

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

SELECT JSON_REMOVE(@json, '$.scores');

Resultat:

+--------------------------------+
| JSON_REMOVE(@json, '$.scores') |
+--------------------------------+
| {"name": "Wag"}                |
+--------------------------------+

Det fjernede hele arrayet fra dokumentet.

For at fjerne et array-element skal du angive elementets indeks. Her er et eksempel på fjernelse af et array-element fra et array:

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

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

Resultat:

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

I dette tilfælde blev det andet array-element fjernet. Arrays er nul-baserede, og derfor $.scores[1] henviser til det andet element i arrayet.

Se nedenfor for hvordan JSON_REMOVE() beskæftiger sig med at fjerne flere stier i arrayet.

Flere stier

Når du angiver flere stier, evalueres de fra venstre mod højre. Det betyder, at resultatet fra den tidligere evaluering bruges som værdi for den næste.

Det kan betale sig at være særligt opmærksom på dette, når du fjerner elementer fra et array baseret på deres indeks.

For det første er her et eksempel, der fjerner flere stier fra et dokument, baseret på deres nøgle:

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

SELECT JSON_REMOVE(@json, '$.type', '$.weight');

Resultat:

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

Hvert nøgle/værdi-par blev fjernet som forventet.

I det næste eksempel fjerner vi ikke nøgle/værdi-parret. I stedet fjerner vi flere elementer fra et array:

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

SELECT 
    JSON_REMOVE(@json, '$.scores[2]', '$.scores[4]') AS a,
    JSON_REMOVE(@json, '$.scores[4]', '$.scores[2]') AS b;

Resultat:

+--------------------------+--------------------------+
| a                        | b                        |
+--------------------------+--------------------------+
| {"scores": [0, 1, 3, 4]} | {"scores": [0, 1, 3, 5]} |
+--------------------------+--------------------------+

I dette tilfælde kaldte vi JSON_REMOVE() to gange. Begge angiver det samme array-indeks, der skal fjernes (2 og 4 ), men vi bytter argumenterne rundt i det andet opkald. I det første eksempel går den til 2 derefter 4 (i nævnte rækkefølge). I det andet eksempel er det 4 derefter 2 .

Dette gav et andet resultat for hvert opkald. Som nævnt evalueres flere stier fra venstre mod højre, og rækkefølgen kan derfor påvirke resultatet.

Her er et andet eksempel, der illustrerer, hvordan resultatet kan være ret anderledes, afhængigt af hvor mange stier der er angivet, hvilke og i hvilken rækkefølge:

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

SELECT 
    JSON_REMOVE(@json, '$.scores[0]', '$.scores[1]', '$.scores[5]') AS a,
    JSON_REMOVE(@json, '$.scores[1]', '$.scores[5]', '$.scores[0]') AS b,
    JSON_REMOVE(@json, '$.scores[5]', '$.scores[0]', '$.scores[1]') AS c,
    JSON_REMOVE(@json, '$.scores[5]', '$.scores[1]', '$.scores[0]') AS d,
    JSON_REMOVE(@json, '$.scores[1]', '$.scores[0]', '$.scores[5]') AS e,
    JSON_REMOVE(@json, '$.scores[0]', '$.scores[5]', '$.scores[1]') AS f;

Resultat (ved hjælp af lodret output):

a: {"scores": [1, 3, 4, 5]}
b: {"scores": [2, 3, 4, 5]}
c: {"scores": [1, 3, 4]}
d: {"scores": [2, 3, 4]}
e: {"scores": [2, 3, 4, 5]}
f: {"scores": [1, 3, 4, 5]}

Nul-argumenter

Hvis et argument er NULL , resultatet er NULL :

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

Resultat:

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

Forkert parameterantal

Kalder JSON_REMOVE() uden et argument resulterer i en fejl:

SELECT JSON_REMOVE();

Resultat:

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

Det er det samme, når der ikke sendes nok argumenter:

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

Resultat:

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

  1. En datamodel for børnefester

  2. SQL-forespørgsel til at oprette tabel i MySQL

  3. Sådan anvender du betinget formatering på et tal i SQL Server ved hjælp af FORMAT()

  4. JDBC MySql-forbindelsespooling praktiserer for at undgå opbrugt forbindelsespulje