sql >> Database >  >> RDS >> Mysql

JSON_MERGE_PATCH() versus JSON_MERGE_PRESERVE() in MySQL:wat is het verschil?

MySQL bevat een aantal functies voor het werken met JSON-documenten. Hiertoe behoren de JSON_MERGE_PATCH() en JSON_MERGE_PRESERVE() functies.

Beide functies voegen twee of meer JSON-documenten samen en retourneren het resultaat. Er zijn echter bepaalde gevallen waarin deze functies een ander resultaat opleveren. U moet hiervan op de hoogte zijn voordat u ze in uw vragen opneemt.

Syntaxis

Ten eerste, hier is de syntaxis voor elke functie:

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

Waar json_doc zijn de JSON-documenten die moeten worden samengevoegd.

Beide functies accepteren dus twee of meer argumenten, die elk de JSON-documenten vertegenwoordigen die moeten worden samengevoegd.

Het verschil

Beide functies werken precies hetzelfde, met de volgende twee uitzonderingen:

  • JSON_MERGE_PATCH() verwijdert elk lid in het eerste object met een overeenkomende sleutel in het tweede object, op voorwaarde dat de waarde die is gekoppeld aan de sleutel in het tweede object niet JSON null is.
  • Als het tweede object een lid heeft met een sleutel die overeenkomt met een lid in het eerste object, JSON_MERGE_PATCH() vervangt de waarde in het eerste object door de waarde in het tweede object, terwijl JSON_MERGE_PRESERVE() voegt de tweede waarde toe aan de eerste waarde.

Dus eigenlijk verschillen ze in de manier waarop ze dubbele sleutels verwerken.

Voorbeeld

Hier is een voorbeeld om het verschil tussen deze twee functies te demonstreren.

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

Resultaat:

+------------------+-----------------------------------+
| JSON_MERGE_PATCH | JSON_MERGE_PRESERVE               |
+------------------+-----------------------------------+
| {"Name": "Bart"} | {"Name": ["Bartholomew", "Bart"]} |
+------------------+-----------------------------------+

We kunnen zien dat JSON_MERGE_PATCH() de waarde van het eerste object vervangen (Bartholomew ) met de tweede objectwaarde (Bart ).

JSON_MERGE_PRESERVE() aan de andere kant, creëerde een array en vulde deze met beide waarden.

Voorbeeld 2 – Arrays

Hier is een voorbeeld van het samenvoegen van twee arrays met dezelfde naam:

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

Resultaat:

+--------------------------------+-------------------------------------------------------+
| JSON_MERGE_PATCH               | JSON_MERGE_PRESERVE                                   |
+--------------------------------+-------------------------------------------------------+
| {"Hobbies": ["Skateboarding"]} | {"Hobbies": ["Trouble", "Mischief", "Skateboarding"]} |
+--------------------------------+-------------------------------------------------------+

Dus in dit geval JSON_MERGE_PATCH() heeft alle elementen in de eerste array vervangen door het element in de tweede array.

JSON_MERGE_PRESERVE() heeft eenvoudig de waarden van beide arrays gecombineerd tot één.

Het is duidelijk dat als de arrays verschillende namen hebben, ze als afzonderlijke arrays eindigen (maar binnen hetzelfde JSON-document). Dus in dergelijke gevallen zullen beide functies hetzelfde resultaat opleveren.

SELECT 
  JSON_MERGE_PATCH('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobby": ["Skateboarding"]}') AS Result
UNION ALL
SELECT 
  JSON_MERGE_PRESERVE('{"Hobbies": ["Trouble", "Mischief"]}', '{"Hobby": ["Skateboarding"]}');

Resultaat:

+------------------------------------------------------------------+
| Result                                                           |
+------------------------------------------------------------------+
| {"Hobby": ["Skateboarding"], "Hobbies": ["Trouble", "Mischief"]} |
| {"Hobby": ["Skateboarding"], "Hobbies": ["Trouble", "Mischief"]} |
+------------------------------------------------------------------+

  1. Hoe voeg je een NOT NULL-kolom toe aan een grote tabel in SQL Server?

  2. Escape een tekenreeks in SQL Server zodat het veilig is om te gebruiken in LIKE-expressie

  3. Hoe MATCH AGAINST werkt in MariaDB

  4. werk met json in orakel