Mysql
 sql >> Datenbank >  >> RDS >> Mysql

JSON_MERGE_PATCH() vs. JSON_MERGE_PRESERVE() in MySQL:Was ist der Unterschied?

MySQL enthält eine Reihe von Funktionen zum Arbeiten mit JSON-Dokumenten. Dazu gehören JSON_MERGE_PATCH() und JSON_MERGE_PRESERVE() Funktionen.

Beide Funktionen führen zwei oder mehr JSON-Dokumente zusammen und geben das Ergebnis zurück. Es gibt jedoch bestimmte Fälle, in denen diese Funktionen ein anderes Ergebnis zurückgeben. Sie müssen sich dessen bewusst sein, bevor Sie sie in eine Ihrer Abfragen aufnehmen.

Syntax

Hier ist zunächst die Syntax für jede Funktion:

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

Wobei json_doc sind die zusammenzuführenden JSON-Dokumente.

Beide Funktionen akzeptieren also zwei oder mehr Argumente, die jeweils die zusammenzuführenden JSON-Dokumente darstellen.

Der Unterschied

Beide Funktionen funktionieren genau gleich, mit den folgenden zwei Ausnahmen:

  • JSON_MERGE_PATCH() entfernt jedes Element im ersten Objekt mit einem übereinstimmenden Schlüssel im zweiten Objekt, vorausgesetzt, dass der mit dem Schlüssel im zweiten Objekt verknüpfte Wert nicht JSON null ist.
  • Wenn das zweite Objekt ein Mitglied mit einem Schlüssel hat, der mit einem Mitglied im ersten Objekt übereinstimmt, JSON_MERGE_PATCH() ersetzt den Wert im ersten Objekt durch den Wert im zweiten Objekt, während JSON_MERGE_PRESERVE() hängt den zweiten Wert an den ersten Wert an.

Sie unterscheiden sich also grundsätzlich in der Art und Weise, wie sie mit doppelten Schlüsseln umgehen.

Beispiel

Hier ist ein Beispiel, um den Unterschied zwischen diesen beiden Funktionen zu demonstrieren.

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

Ergebnis:

+-------------+------------------ --------+| JSON_MERGE_PATCH | JSON_MERGE_PRESERVE |+-----------------+--------------------------------- -------+| {"Name":"Bart"} | {"Name":["Bartholomäus", "Bart"]} |+-------------+-------------- ---------------------+

Wir können diesen JSON_MERGE_PATCH() sehen ersetzte den Wert des ersten Objekts (Bartholomew ) mit dem zweiten Objektwert (Bart ).

JSON_MERGE_PRESERVE() andererseits ein Array erstellt und mit beiden Werten gefüllt.

Beispiel 2 – Arrays

Hier ist ein Beispiel für das Zusammenführen von zwei Arrays mit demselben Namen:

SELECT JSON_MERGE_PATCH('{"Hobbies":["Trouble", "Mischief"]}', '{"Hobbies":["Skateboarding"]}') JSON_MERGE_PATCH, JSON_MERGE_PRESERVE('{"Hobbies":[" Ärger", "Unfug"]}', '{"Hobbies":["Skateboarding"]}') JSON_MERGE_PRESERVE;

Ergebnis:

+---------------------------+--------------------- ---------------------------------+| JSON_MERGE_PATCH | JSON_MERGE_PRESERVE |+----------------------------------------+-------------- -----------------------------------------+| {"Hobbies":["Skateboarden"]} | {"Hobbies":["Ärger", "Unfug", "Skateboarden"]} |+----------------------------------------- ---+---------------------------------------------- ---------+

In diesem Fall also JSON_MERGE_PATCH() hat alle Elemente im ersten Array durch das Element im zweiten Array ersetzt.

JSON_MERGE_PRESERVE() hat einfach die Werte beider Arrays zu einem kombiniert.

Wenn die Arrays unterschiedliche Namen haben, werden sie natürlich als separate Arrays enden (aber innerhalb desselben JSON-Dokuments). In solchen Fällen werden also beide Funktionen das gleiche Ergebnis zurückgeben.

SELECT JSON_MERGE_PATCH('{"Hobbies":["Trouble", "Mischief"]}', '{"Hobby":["Skateboarding"]}') AS ResultUNION ALLSELECT JSON_MERGE_PRESERVE('{"Hobbies":[ "Ärger", "Unfug"]}', '{"Hobby":["Skateboarding"]}');

Ergebnis:

+---------------------------------------------- --------------------+| Ergebnis |+------------------------------------------------------------ -------------------+| {"Hobby":["Skateboarding"], "Hobbys":["Ärger", "Unfug"]} || {"Hobby":["Skateboarding"], "Hobbys":["Ärger", "Unfug"]} |+----------------------- -------------------------------------------+