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

JSON_MERGE_PATCH() vs JSON_MERGE_PRESERVE() in MySQL:qual è la differenza?

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, mentre JSON_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"]} |
+------------------------------------------------------------------+