In MySQL, il JSON_MERGE_PRESERVE()
La funzione unisce due o più documenti JSON e restituisce il risultato.
Fornisci i documenti JSON come argomenti.
Questa funzione è stata aggiunta in MySQL 8.0.3 come sinonimo di JSON_MERGE()
, tuttavia, il JSON_MERGE()
la funzione è ora deprecata ed è soggetta a rimozione in una versione futura di MySQL.
Sintassi
La sintassi è questa:
JSON_MERGE_PRESERVE(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.
Se un argomento è NULL
, questa funzione restituisce NULL
.
Esempio 1 – Utilizzo di base
Ecco un esempio da dimostrare.
SELECT JSON_MERGE_PRESERVE('{"Name": "Homer"}', '{"Age": 39}') Result;
Risultato:
+------------------------------+ | Result | +------------------------------+ | {"Age": 39, "Name": "Homer"} | +------------------------------+
Quindi, in questo esempio, abbiamo unito due oggetti separati in un unico oggetto.
Questo è esattamente lo stesso risultato che otterremmo se utilizzassimo JSON_MERGE_PATCH()
funzione. Tuttavia, se proviamo a unire chiavi duplicate, queste due funzioni produrranno risultati diversi.
Esempio 2:chiavi duplicate
Come suggerisce il nome, il JSON_MERGE_PRESERVE()
la funzione conserva i membri con chiavi duplicate (questo è dove differisce da JSON_MERGE_PATCH()
funzione).
SELECT JSON_MERGE_PRESERVE('{"Name": "Bartholomew"}', '{"Name": "Bart"}') Result;
Risultato:
+-----------------------------------+ | Result | +-----------------------------------+ | {"Name": ["Bartholomew", "Bart"]} | +-----------------------------------+
Quindi, in questo caso, è stato creato un array e sia Bart che Bartholomew sono stati aggiunti come elementi separati di quell'array.
Questo è in contrasto con JSON_MERGE_PATCH()
funzione, che esegue le seguenti operazioni:
SELECT JSON_MERGE_PATCH('{"Name": "Bartholomew"}', '{"Name": "Bart"}') Result;
Risultato:
+------------------+ | Result | +------------------+ | {"Name": "Bart"} | +------------------+
Esempio 3 – Membri multipli
Ecco un altro esempio, ma con un membro aggiuntivo nell'oggetto:
SELECT JSON_MERGE_PRESERVE('{"Name": "Bartholomew", "Age": 10}', '{"Name": "Bart"}') Result;
Risultato:
+----------------------------------------------+ | Result | +----------------------------------------------+ | {"Age": 10, "Name": ["Bartholomew", "Bart"]} | +----------------------------------------------+
Funziona anche al contrario:il risultato è lo stesso se aggiungiamo il membro aggiuntivo al secondo oggetto.
SELECT JSON_MERGE_PRESERVE('{"Name": "Bartholomew"}', '{"Name": "Bart", "Age": 10}') Result;
Risultato:
+----------------------------------------------+ | Result | +----------------------------------------------+ | {"Age": 10, "Name": ["Bartholomew", "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_PRESERVE('{"Name": "Bart"}', '{"Age": 10}', '{"Hair Color": "Yellow"}') Result;
Risultato:
+-----------------------------------------------------+ | Result | +-----------------------------------------------------+ | {"Age": 10, "Name": "Bart", "Hair Color": "Yellow"} | +-----------------------------------------------------+
Esempio 5 – Matrici
Ecco un esempio di unione di due array con lo stesso nome:
SELECT JSON_MERGE_PRESERVE('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobbies": ["Skateboarding"]}') Result;
Risultato:
+-------------------------------------------------------+ | Result | +-------------------------------------------------------+ | {"Hobbies": ["Trouble", "Mischief", "Skateboarding"]} | +-------------------------------------------------------+
Questo è un altro esempio in cui JSON_MERGE_PATCH()
restituirebbe un risultato diverso.
Ovviamente, se gli array hanno nomi diversi, finiranno come array separati (ma all'interno dello stesso documento JSON):
SELECT JSON_MERGE_PRESERVE('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobby": ["Skateboarding"]}') Result;
Risultato:
+------------------------------------------------------------------+ | Result | +------------------------------------------------------------------+ | {"Hobby": ["Skateboarding"], "Hobbies": ["Trouble", "Mischief"]} | +------------------------------------------------------------------+
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"], "Hobbies": ["Trouble"] } }'; SELECT JSON_MERGE_PRESERVE(@data1, @data2) Result;
Risultato:
+------------------------------------------------------------------------------------------------------------------------------+ | Result | +------------------------------------------------------------------------------------------------------------------------------+ | {"Suspect": {"Age": 10, "Name": "Bart", "Hobbies": ["Skateboarding", "Mischief", "Trouble"], "Parents": ["Marge", "Homer"]}} | +------------------------------------------------------------------------------------------------------------------------------+
Per le regole esatte su come questa funzione esegue le unioni, vedere la documentazione di MySQL.