MySQL include una serie di funzioni per lavorare con i documenti JSON. Tra questi ci sono JSON_MERGE_PATCH()
e JSON_MERGE_PRESERVE()
funzioni.
Entrambe queste funzioni uniscono due o più documenti JSON e restituiscono il risultato. Tuttavia, ci sono alcuni casi in cui queste funzioni restituiranno un risultato diverso. Devi esserne consapevole prima di includerli in una qualsiasi delle tue domande.
Sintassi
Innanzitutto, ecco la sintassi per ciascuna funzione:
JSON_MERGE_PATCH(json_doc, json_doc[, json_doc] ...) JSON_MERGE_PRESERVE(json_doc, json_doc[, json_doc] ...)
Dove json_doc
sono i documenti JSON da unire.
Quindi entrambe le funzioni accettano due o più argomenti, ognuno dei quali rappresenta i documenti JSON da unire.
La differenza
Entrambe le funzioni funzionano esattamente allo stesso modo, con le due eccezioni seguenti:
JSON_MERGE_PATCH()
rimuove qualsiasi membro nel primo oggetto con una chiave corrispondente nel secondo oggetto, a condizione che il valore associato alla chiave nel secondo oggetto non sia JSON null.- Se il secondo oggetto ha un membro con una chiave che corrisponde a un membro nel primo oggetto,
JSON_MERGE_PATCH()
sostituisce il valore nel primo oggetto con il valore nel secondo oggetto, mentreJSON_MERGE_PRESERVE()
aggiunge il secondo valore al primo valore.
Quindi, sostanzialmente, differiscono nel modo in cui gestiscono le chiavi duplicate.
Esempio
Ecco un esempio per dimostrare la differenza tra queste due funzioni.
SELECT JSON_MERGE_PATCH('{"Name": "Bartholomew"}', '{"Name": "Bart"}') JSON_MERGE_PATCH, JSON_MERGE_PRESERVE('{"Name": "Bartholomew"}', '{"Name": "Bart"}') JSON_MERGE_PRESERVE;
Risultato:
+------------------+-----------------------------------+ | JSON_MERGE_PATCH | JSON_MERGE_PRESERVE | +------------------+-----------------------------------+ | {"Name": "Bart"} | {"Name": ["Bartholomew", "Bart"]} | +------------------+-----------------------------------+
Possiamo vedere che JSON_MERGE_PATCH()
ha sostituito il valore del primo oggetto (Bartholomew
) con il secondo valore dell'oggetto (Bart
).
JSON_MERGE_PRESERVE()
d'altra parte, ha creato un array e lo ha popolato con entrambi i valori.
Esempio 2 – Matrici
Ecco un esempio di unione di due array con lo stesso nome:
SELECT JSON_MERGE_PATCH('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobbies": ["Skateboarding"]}') JSON_MERGE_PATCH, JSON_MERGE_PRESERVE('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobbies": ["Skateboarding"]}') JSON_MERGE_PRESERVE;
Risultato:
+--------------------------------+-------------------------------------------------------+ | JSON_MERGE_PATCH | JSON_MERGE_PRESERVE | +--------------------------------+-------------------------------------------------------+ | {"Hobbies": ["Skateboarding"]} | {"Hobbies": ["Trouble", "Mischief", "Skateboarding"]} | +--------------------------------+-------------------------------------------------------+
Quindi, in questo caso, JSON_MERGE_PATCH()
ha sostituito tutti gli elementi nel primo array con l'elemento nel secondo array.
JSON_MERGE_PRESERVE()
ha semplicemente combinato i valori di entrambi gli array in uno.
Ovviamente, se gli array hanno nomi diversi, finiranno come array separati (ma all'interno dello stesso documento JSON). Quindi, in questi casi, entrambe le funzioni restituiranno lo stesso risultato.
SELECT JSON_MERGE_PATCH('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobby": ["Skateboarding"]}') AS Result UNION ALL SELECT JSON_MERGE_PRESERVE('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobby": ["Skateboarding"]}');
Risultato:
+------------------------------------------------------------------+ | Result | +------------------------------------------------------------------+ | {"Hobby": ["Skateboarding"], "Hobbies": ["Trouble", "Mischief"]} | | {"Hobby": ["Skateboarding"], "Hobbies": ["Trouble", "Mischief"]} | +------------------------------------------------------------------+