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

JSON_MERGE_PATCH() vs JSON_MERGE_PRESERVE() i MySQL:Hvad er forskellen?

MySQL inkluderer en række funktioner til at arbejde med JSON-dokumenter. Blandt disse er JSON_MERGE_PATCH() og JSON_MERGE_PRESERVE() funktioner.

Begge disse funktioner fletter to eller flere JSON-dokumenter og returnerer resultatet. Der er dog visse tilfælde, hvor disse funktioner vil returnere et andet resultat. Du skal være opmærksom på dette, før du inkluderer dem i nogen af ​​dine forespørgsler.

Syntaks

Først her er syntaksen for hver funktion:

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

Hvor json_doc er JSON-dokumenterne, der skal flettes.

Så begge funktioner accepterer to eller flere argumenter, der hver repræsenterer de JSON-dokumenter, der skal flettes.

Forskellen

Begge funktioner fungerer nøjagtigt det samme, med følgende to undtagelser:

  • JSON_MERGE_PATCH() fjerner ethvert medlem i det første objekt med en matchende nøgle i det andet objekt, forudsat at værdien forbundet med nøglen i det andet objekt ikke er JSON null.
  • Hvis det andet objekt har et medlem med en nøgle, der matcher et medlem i det første objekt, JSON_MERGE_PATCH() erstatter værdien i det første objekt med værdien i det andet objekt, hvorimod JSON_MERGE_PRESERVE() føjer den anden værdi til den første værdi.

Så dybest set adskiller de sig i den måde, de håndterer duplikerede nøgler på.

Eksempel

Her er et eksempel for at demonstrere forskellen mellem disse to funktioner.

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

Resultat:

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

Vi kan se, at JSON_MERGE_PATCH() erstattede det første objekts værdi (Bartholomew ) med den anden objektværdi (Bart ).

JSON_MERGE_PRESERVE() på den anden side oprettede en matrix og udfyldte den med begge værdier.

Eksempel 2 – Arrays

Her er et eksempel på sammenlægning af to arrays med samme navn:

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

Resultat:

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

Så i dette tilfælde, JSON_MERGE_PATCH() har erstattet alle elementer i det første array med elementet i det andet array.

JSON_MERGE_PRESERVE() har simpelthen kombineret værdierne af begge arrays til én.

Det er klart, at hvis arrays har forskellige navne, ender de som separate arrays (men inden for det samme JSON-dokument). Så i sådanne tilfælde vil begge funktioner returnere det samme resultat.

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

Resultat:

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

  1. psql:FATAL:Peer-godkendelse mislykkedes for brugerudvikler

  2. Lad MySQL-brugere oprette databaser, men tillad kun adgang til deres egne databaser

  3. PostgreSQL 11:Patch-anmeldere til partitionering af patches

  4. Sådan tilføjes og trækkes dag, måned, år i dato gennem MySql Query