sql >> Database >  >> RDS >> Mysql

JSON_MERGE_PRESERVE() – Voeg meerdere JSON-documenten samen in MySQL

In MySQL, de JSON_MERGE_PRESERVE() functie voegt twee of meer JSON-documenten samen en retourneert het resultaat.

U levert de JSON-documenten als argumenten.

Deze functie is toegevoegd in MySQL 8.0.3 als synoniem voor JSON_MERGE() , echter, de JSON_MERGE() functie is nu verouderd en kan in een toekomstige release van MySQL worden verwijderd.

Syntaxis

De syntaxis gaat als volgt:

JSON_MERGE_PRESERVE(json_doc, json_doc[, json_doc] ...)

Waar json_doc zijn de JSON-documenten die moeten worden samengevoegd.

Als een van de documenten ongeldig is, wordt er een fout gegenereerd.

Als een argument NULL is , deze functie retourneert NULL .

Voorbeeld 1 – Basisgebruik

Hier is een voorbeeld om te demonstreren.

SELECT JSON_MERGE_PRESERVE('{"Name": "Homer"}', '{"Age": 39}') Result;

Resultaat:

+------------------------------+
| Result                       |
+------------------------------+
| {"Age": 39, "Name": "Homer"} |
+------------------------------+

Dus in dit voorbeeld hebben we twee afzonderlijke objecten samengevoegd tot één object.

Dit is precies hetzelfde resultaat dat we zouden krijgen als we de JSON_MERGE_PATCH() zouden gebruiken functie. Als we echter dubbele sleutels proberen samen te voegen, zullen deze twee functies verschillende resultaten opleveren.

Voorbeeld 2 – Dubbele sleutels

Zoals de naam al doet vermoeden, is de JSON_MERGE_PRESERVE() functie behoudt leden met dubbele sleutels (dit is waar het verschilt van de JSON_MERGE_PATCH() functie).

SELECT 
  JSON_MERGE_PRESERVE('{"Name": "Bartholomew"}', '{"Name": "Bart"}') Result;

Resultaat:

+-----------------------------------+
| Result                            |
+-----------------------------------+
| {"Name": ["Bartholomew", "Bart"]} |
+-----------------------------------+

In dit geval is er dus een array gemaakt en zijn zowel Bart als Bartholomew toegevoegd als afzonderlijke elementen van die array.

Dit in tegenstelling tot de JSON_MERGE_PATCH() functie, die het volgende doet:

SELECT 
  JSON_MERGE_PATCH('{"Name": "Bartholomew"}', '{"Name": "Bart"}') Result;

Resultaat:

+------------------+
| Result           |
+------------------+
| {"Name": "Bart"} |
+------------------+

Voorbeeld 3 – Meerdere leden

Hier is nog een voorbeeld, maar met een extra lid in het object:

SELECT 
  JSON_MERGE_PRESERVE('{"Name": "Bartholomew", "Age": 10}', '{"Name": "Bart"}') Result;

Resultaat:

+----------------------------------------------+
| Result                                       |
+----------------------------------------------+
| {"Age": 10, "Name": ["Bartholomew", "Bart"]} |
+----------------------------------------------+

Dit werkt ook andersom – het resultaat is hetzelfde als we het extra lid aan het tweede object toevoegen.

SELECT 
  JSON_MERGE_PRESERVE('{"Name": "Bartholomew"}', '{"Name": "Bart", "Age": 10}') Result;

Resultaat:

+----------------------------------------------+
| Result                                       |
+----------------------------------------------+
| {"Age": 10, "Name": ["Bartholomew", "Bart"]} |
+----------------------------------------------+

Voorbeeld 4 – Meer documenten

U bent niet beperkt tot het samenvoegen van slechts twee documenten. U kunt er zoveel samenvoegen als nodig is. Hier is een voorbeeld van het samenvoegen van drie objecten.

SELECT 
  JSON_MERGE_PRESERVE('{"Name": "Bart"}', '{"Age": 10}', '{"Hair Color": "Yellow"}') Result;

Resultaat:

+-----------------------------------------------------+
| Result                                              |
+-----------------------------------------------------+
| {"Age": 10, "Name": "Bart", "Hair Color": "Yellow"} |
+-----------------------------------------------------+

Voorbeeld 5 – Arrays

Hier is een voorbeeld van het samenvoegen van twee arrays met dezelfde naam:

SELECT 
  JSON_MERGE_PRESERVE('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobbies": ["Skateboarding"]}') Result;

Resultaat:

+-------------------------------------------------------+
| Result                                                |
+-------------------------------------------------------+
| {"Hobbies": ["Trouble", "Mischief", "Skateboarding"]} |
+-------------------------------------------------------+

Dit is een ander voorbeeld waarbij JSON_MERGE_PATCH() zou een ander resultaat opleveren.

Het is duidelijk dat als de arrays verschillende namen hebben, ze als afzonderlijke arrays eindigen (maar binnen hetzelfde JSON-document):

SELECT 
  JSON_MERGE_PRESERVE('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobby": ["Skateboarding"]}') Result;

Resultaat:

+------------------------------------------------------------------+
| Result                                                           |
+------------------------------------------------------------------+
| {"Hobby": ["Skateboarding"], "Hobbies": ["Trouble", "Mischief"]} |
+------------------------------------------------------------------+

Voorbeeld 6 – Een groter JSON-document

Hier is een voorbeeld dat (iets) grotere JSON-documenten samenvoegt.

SET @data1 = '{  
    "Suspect": {    
       "Name": "Bart", 
       "Hobbies": ["Skateboarding", "Mischief"]  
    }
 }',
 @data2 = '{  
    "Suspect": {    
       "Age": 10, 
       "Parents": ["Marge", "Homer"],
       "Hobbies": ["Trouble"]  
    }
 }';
SELECT JSON_MERGE_PRESERVE(@data1, @data2) Result;

Resultaat:

+------------------------------------------------------------------------------------------------------------------------------+
| Result                                                                                                                       |
+------------------------------------------------------------------------------------------------------------------------------+
| {"Suspect": {"Age": 10, "Name": "Bart", "Hobbies": ["Skateboarding", "Mischief", "Trouble"], "Parents": ["Marge", "Homer"]}} |
+------------------------------------------------------------------------------------------------------------------------------+

Voor de exacte regels voor hoe deze functie merges uitvoert, zie de MySQL-documentatie.


  1. Vind een waarde overal in een database

  2. Huidige datum en tijd invoegen in SQLite-database

  3. mysql controleren of getallen in een door komma's gescheiden lijst staan

  4. ORACLE SQL:Haal alle gehele getallen tussen twee getallen