sql >> Database teknologi >  >> RDS >> Mysql

JSON_REMOVE() – Fjern data fra et JSON-dokument i MySQL

I MySQL er JSON_REMOVE() funktionen fjerner data fra et JSON-dokument og returnerer resultatet.

Du angiver JSON-dokumentet som det første argument, efterfulgt af stien til at fjerne data fra. Du kan angive flere stier, hvis det kræves.

Syntaks

Syntaksen ser sådan ud:

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

Hvor json_doc er JSON-dokumentet og path er stien til at fjerne data fra.

path argumenter vurderes fra venstre mod højre. Dokumentet, der produceres ved at evaluere én sti, bliver den nye værdi, som den næste sti evalueres i forhold til.

Det første argument skal være et gyldigt JSON-dokument, ellers opstår der en fejl.

Også path argument skal være et gyldigt stiudtryk, og det må ikke være $ eller indeholder en * eller ** jokertegn, ellers vil der opstå en fejl.

Eksempel 1 – Grundlæggende brug

Her er et eksempel til at demonstrere.

SELECT JSON_REMOVE('{"a":1, "b":2, "c":3}', '$.b') SOM 'Resultat';

Resultat:

+------------------------+| Resultat |+------------------------+| {"a":1, "c":3} |+------------------------+

I dette tilfælde fjernede vi nøgle/værdi-parret med nøglen b . Dette skyldes, at vi har angivet $.b som det andet argument.

Her er et andet eksempel:

SELECT JSON_REMOVE('{"Navn":"Homer", "Køn":"Mand", "Alder":39}', '$.Alder') SOM 'Resultat';

Resultat:

+--------------------------------------------+| Resultat |+---------------------------------------------+| {"Navn":"Homer", "Køn":"Mand"} |+-------------------------------------- ------+

Eksempel 2 – Ikke-eksisterende sti

Hvis du angiver en sti, der ikke eksisterer, fjernes intet. Det originale JSON-dokument returneres uden ændringer.

SELECT JSON_REMOVE('{"Navn":"Homer", "Alder":39}', '$.Køn') SOM 'Resultat';

Resultat:

+--------------------------------------+| Resultat |+-------------------------------------+| {"Alder":39, "Navn":"Homer"} |+------------------------------------+ 

Eksempel 3 – Arrays

Her er et eksempel, hvor du bruger et array.

SELECT JSON_REMOVE('[1, 2, 3]', '$[0]') SOM 'Resultat';

Resultat:

+--------+| Resultat |+--------+| [2, 3] |+--------+

Arrays bruger nul-baseret nummerering, så i dette tilfælde fjernes det første element fra arrayet.

Her er et andet array-eksempel. Denne gang fjerner vi en værdi fra et indlejret array.

SELECT JSON_REMOVE('[1, 2, [3, 4, 5]]', '$[2][1]') SOM 'Resultat';

Resultat:

+----------------+| Resultat |+----------------+| [1, 2, [3, 5]] |+----------------+

Eksempel 4 – Flere stier

Du kan angive mere end én sti for at fjerne data fra flere steder i JSON-dokumentet.

Grundlæggende eksempel:

SELECT JSON_REMOVE('[1, 2, 3, 4, 5]', '$[1]', '$[3]') SOM 'Resultat';

Resultat:

+------------+| Resultat |+-----------+| [1, 3, 4] |+------------+

Som nævnt er path argumenter evalueres fra venstre mod højre, og dokumentet, der produceres ved at evaluere én sti, bliver den nye værdi, som den næste sti evalueres i forhold til.

Derfor fjerner det 2. sti-argument i dette eksempel en anden værdi, end det ville have fjernet, hvis det havde været det eneste sti-argument. Hvis det havde været det eneste sti-argument, ville det have fjernet 4 .

Her er hvad jeg mener:

SELECT JSON_REMOVE('[1, 2, 3, 4, 5]', '$[3]') SOM 'One Path', JSON_REMOVE('[1, 2, 3, 4, 5]', ' $[1]', '$[3]') SOM 'To stier';

Resultat:

+--------------+-----------+| En vej | To veje |+--------------+-----------+| [1, 2, 3, 5] | [1, 3, 4] |+--------------+-----------+

Så det kan du se, når vi bruger $[3] som den eneste sti fjerner den 4 fra arrayet. Men når vi bruger det som 2. sti, fjerner det 5 (og 4 efterlades urørt).

Et andet eksempel, denne gang sletning af værdier fra en matrix og en indlejret matrix:

SELECT JSON_REMOVE('[1, 2, [3, 4, 5]]', '$[0]', '$[1][1]') SOM 'Resultat';

Resultat:

+-------------+| Resultat |+-------------+| [2, [3, 5]] |+-------------+

Så igen, selvom arrayet er i position 2 i det originale dokument, den første stiværdi ($[0] ) hugger det ydre array ned, og det indre array skifter til position 1 .

Hvis dette får dit hoved til at snurre, kan du altid bytte sti-argumenterne rundt, så værdierne længst til højre fjernes først. På den måde vil det ikke påvirke placeringen af ​​værdierne længst til venstre, og derfor kan du angive stierne baseret på det originale JSON-dokument.

Så vi kan ændre den forrige kode til følgende og få det samme resultat:

SELECT JSON_REMOVE('[1, 2, [3, 4, 5]]', '$[2][1]', '$[0]') SOM 'Resultat';

Resultat:

+-------------+| Resultat |+-------------+| [2, [3, 5]] |+-------------+

Eksempel 5 – Et større JSON-dokument

Her er et eksempel med et (lidt) større JSON-dokument.

SET @data ='{ "Person":{ "Navn":"Homer", "Alder":39, "Hobbyer":["Spise", "Sover", "Base Jumping"] } }'; SELECT JSON_REMOVE(@data, '$.Person.Age', '$.Person.Hobbies[2]') SOM 'Resultat';

Resultat:

+------------------------------------------------------ --------------------+| Resultat |+------------------------------------------------------ ------------------+| {"Person":{"Navn":"Homer", "Hobbyer":["Spise", "Sover"]}} |+------------------------- -------------------------------------------------------+ 
  1. Er der en RIGTIG ydelsesforskel mellem INT og VARCHAR primære nøgler?

  2. Grundlæggende administration Sammenligning mellem Oracle, MSSQL, MySQL, PostgreSQL

  3. Sammenlægning af to rækker til én, mens nulværdier erstattes

  4. Fejlfind en fejl, når du forsøger at oprette en stor IMDB-model