In MySQL, il JSON_MERGE_PATCH() La funzione esegue un'unione conforme a RFC 7396 di due o più documenti JSON, senza preservare i membri con chiavi duplicate.
Fornisci i documenti JSON come argomenti.
Sintassi
La sintassi è questa:
JSON_MERGE_PATCH(json_doc, json_doc[, json_doc] ...)
Dove json_doc sono i documenti JSON da unire. Se uno qualsiasi dei documenti non è valido, viene generato un errore.
Esempio 1 – Utilizzo di base
Ecco un esempio da dimostrare.
SELECT JSON_MERGE_PATCH('{"Name": "Homer"}', '{"Age": 39}') Result;
Risultato:
+------------------------------+
| Result |
+------------------------------+
| {"Age": 39, "Name": "Homer"} |
+------------------------------+
Quindi, in questo esempio, abbiamo unito due oggetti separati in un unico oggetto.
Esempio 2:chiavi duplicate
Come accennato, questa funzione non preserva i membri con chiavi duplicate. Esempio:
SELECT
JSON_MERGE_PATCH('{"Name": "Bartholomew"}', '{"Name": "Bart"}') Result;
Risultato:
+------------------+
| Result |
+------------------+
| {"Name": "Bart"} |
+------------------+
Quindi in questo caso ha vinto Bart.
Se hai bisogno di preservare i membri con chiavi duplicate, usa il JSON_MERGE_PRESERVE() funzione invece. Usando quella funzione per questo esempio si trasformerebbe in Name in un array contenente entrambi Bartholomew e Bart . In questo modo:
SELECT
JSON_MERGE_PRESERVE('{"Name": "Bartholomew"}', '{"Name": "Bart"}') Result;
Risultato:
+-----------------------------------+
| Result |
+-----------------------------------+
| {"Name": ["Bartholomew", "Bart"]} |
+-----------------------------------+
Esempio 3 – Membri multipli
Ecco un altro esempio, ma con un membro aggiuntivo nell'oggetto:
SELECT
JSON_MERGE_PATCH('{"Name": "Bartholomew", "Age": 10}', '{"Name": "Bart"}') Result;
Risultato:
+-----------------------------+
| Result |
+-----------------------------+
| {"Age": 10, "Name": "Bart"} |
+-----------------------------+
Quindi, Bart vince ancora ed è stato fuso con gli altri membri del primo oggetto.
Naturalmente, questo funziona anche al contrario:il risultato è lo stesso se aggiungiamo il membro aggiuntivo al secondo oggetto.
SELECT
JSON_MERGE_PATCH('{"Name": "Bartholomew"}', '{"Name": "Bart", "Age": 10}') Result;
Risultato:
+-----------------------------+
| Result |
+-----------------------------+
| {"Age": 10, "Name": "Bart"} |
+-----------------------------+
Esempio 4 – Altri documenti
Non sei limitato a unire solo due documenti. Puoi unirne quanti ne desideri. Ecco un esempio di unione di tre oggetti.
SELECT
JSON_MERGE_PATCH('{"Name": "Bart"}', '{"Age": 10}', '{"Hair Color": "Yellow"}') Result;
Risultato:
+-----------------------------------------------------+
| Result |
+-----------------------------------------------------+
| {"Age": 10, "Name": "Bart", "Hair Color": "Yellow"} |
+-----------------------------------------------------+
Esempio 5 – Matrici
L'unione di due array con lo stesso nome comporterà la conservazione di uno solo di essi:
SELECT
JSON_MERGE_PATCH('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobbies": ["Skateboarding"]}') Result;
Risultato:
+--------------------------------+
| Result |
+--------------------------------+
| {"Hobbies": ["Skateboarding"]} |
+--------------------------------+
Ancora una volta, puoi usare JSON_MERGE_PRESERVE() se è necessario preservare entrambi gli array. Quindi l'esempio precedente può essere riscritto come segue:
SELECT
JSON_MERGE_PRESERVE('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobbies": ["Skateboarding"]}') Result;
Risultato:
+-------------------------------------------------------+
| Result |
+-------------------------------------------------------+
| {"Hobbies": ["Trouble", "Mischief", "Skateboarding"]} |
+-------------------------------------------------------+
Esempio 6:un documento JSON più grande
Ecco un esempio che unisce documenti JSON (leggermente) più grandi.
SET @data1 = '{
"Suspect": {
"Name": "Bart",
"Hobbies": ["Skateboarding", "Mischief"]
}
}',
@data2 = '{
"Suspect": {
"Age": 10,
"Parents": ["Marge", "Homer"]
}
}';
SELECT JSON_MERGE_PATCH(@data1, @data2) Result;
Risultato:
+-------------------------------------------------------------------------------------------------------------------+
| Result |
+-------------------------------------------------------------------------------------------------------------------+
| {"Suspect": {"Age": 10, "Name": "Bart", "Hobbies": ["Skateboarding", "Mischief"], "Parents": ["Marge", "Homer"]}} |
+-------------------------------------------------------------------------------------------------------------------+
Per le regole esatte su come questa funzione esegue le unioni, vedere la documentazione di MySQL.