sql >> Databáze >  >> RDS >> Mysql

JSON_MERGE_PATCH() vs JSON_MERGE_PRESERVE() v MySQL:Jaký je rozdíl?

MySQL obsahuje řadu funkcí pro práci s dokumenty JSON. Mezi ně patří JSON_MERGE_PATCH() a JSON_MERGE_PRESERVE() funkce.

Obě tyto funkce sloučí dva nebo více dokumentů JSON a vrátí výsledek. Existují však určité případy, kdy tyto funkce vrátí jiný výsledek. Musíte si toho být vědomi, než je zahrnete do jakéhokoli ze svých dotazů.

Syntaxe

Nejprve je zde syntaxe pro každou funkci:

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

Kde json_doc jsou dokumenty JSON, které mají být sloučeny.

Obě funkce tedy přijímají dva nebo více argumentů, z nichž každý představuje dokumenty JSON, které mají být sloučeny.

Rozdíl

Obě funkce fungují úplně stejně, s následujícími dvěma výjimkami:

  • JSON_MERGE_PATCH() odebere jakéhokoli člena v prvním objektu s odpovídajícím klíčem ve druhém objektu za předpokladu, že hodnota spojená s klíčem v druhém objektu není JSON null.
  • Pokud má druhý objekt člena s klíčem odpovídajícím členovi v prvním objektu, JSON_MERGE_PATCH() nahradí hodnotu v prvním objektu hodnotou v druhém objektu, zatímco JSON_MERGE_PRESERVE() připojí druhou hodnotu k první hodnotě.

V zásadě se tedy liší ve způsobu, jakým zpracovávají duplicitní klíče.

Příklad

Zde je příklad, který demonstruje rozdíl mezi těmito dvěma funkcemi.

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

Výsledek:

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

Vidíme, že JSON_MERGE_PATCH() nahradil hodnotu prvního objektu (Bartholomew ) s hodnotou druhého objektu (Bart ).

JSON_MERGE_PRESERVE() na druhé straně vytvořil pole a naplnil jej oběma hodnotami.

Příklad 2 – Pole

Zde je příklad sloučení dvou polí se stejným názvem:

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

Výsledek:

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

V tomto případě tedy JSON_MERGE_PATCH() nahradil všechny prvky v prvním poli prvkem v druhém poli.

JSON_MERGE_PRESERVE() jednoduše spojil hodnoty obou polí do jednoho.

Je zřejmé, že pokud mají pole různé názvy, skončí jako samostatná pole (ale ve stejném dokumentu JSON). Takže v takových případech obě funkce vrátí stejný výsledek.

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

Výsledek:

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

  1. ORACLE a TRIGGERS (vloženo, aktualizováno, odstraněno)

  2. Pochopení uváznutí v MySQL a PostgreSQL

  3. Systém resetování hesla v PHP

  4. ORA-30926:nelze získat stabilní sadu řádků ve zdrojových tabulkách