Při používání dokumentů JSON s MySQL můžete použít JSON_ARRAY_APPEND()
funkce pro připojení nových hodnot k poli.
Funguje to tak, že jako první argument zadáte dokument JSON, poté následuje cesta, ke které se má připojit, následovaná hodnotou, kterou chcete připojit.
V MySQL 5.7 se tato funkce nazývala JSON_APPEND()
ale tento název již není podporován.
Syntaxe
Syntaxe vypadá takto:
JSON_ARRAY_APPEND(json_doc, path, val[, path, val] ...)
Kde:
json_doc
je dokument JSON.path
je cesta prvku, ke kterému se má připojit nová hodnota.val
je nová hodnota, která bude připojena.
Páry cesta-hodnota se vyhodnocují zleva doprava. Dokument vytvořený vyhodnocením jednoho páru se stane novou hodnotou, vůči které je vyhodnocen další pár.
Příklad 1 – Základní použití
Zde je příklad k demonstraci.
SELECT JSON_ARRAY_APPEND('[1, 2, 3]', '$', 4) AS 'Result';
Výsledek:
+--------------+ | Result | +--------------+ | [1, 2, 3, 4] | +--------------+
Takže 3. argument je připojen k poli. V tomto případě používám $
pro cestu. Toto je synonymum pro dokument JSON, takže hodnota je připojena k poli nejvyšší úrovně (což je v tomto případě shodou okolností jediné pole).
Příklad 2 – vnořené pole
Zde je příklad připojení hodnoty k poli, které je vnořeno do jiného pole.
SELECT JSON_ARRAY_APPEND('[1, 2, [3, 4]]', '$[2]', 5) AS 'Result';
Výsledek:
+-------------------+ | Result | +-------------------+ | [1, 2, [3, 4, 5]] | +-------------------+
Zde tedy používám $[2]
jako cesta. Toto určuje pole na třetím prvku (pole používají číslování založené na nule, takže počet začíná od nuly).
Pokud u tohoto prvku ještě pole nebylo, vytvoří se pole nové.
Takhle:
SELECT JSON_ARRAY_APPEND('[1, 2, 3]', '$[2]', 4) AS 'Result';
Výsledek:
+----------------+ | Result | +----------------+ | [1, 2, [3, 4]] | +----------------+
Příklad 3 – Větší dokument JSON
Tento příklad používá (trochu) větší dokument JSON. To ukazuje, jak se cesta mění v závislosti na tom, kde se pole v dokumentu nachází.
SET @data = '{ "Person": { "Name": "Homer", "Hobbies": ["Eating", "Sleeping"] } }'; SELECT JSON_ARRAY_APPEND(@data, '$.Person.Hobbies', "Base Jumping") AS 'Result';
Výsledek:
+----------------------------------------------------------------------------------+ | Result | +----------------------------------------------------------------------------------+ | {"Person": {"Name": "Homer", "Hobbies": ["Eating", "Sleeping", "Base Jumping"]}} | +----------------------------------------------------------------------------------+
A stejně jako v předchozím příkladu můžeme v případě potřeby vytvořit nové vnořené pole:
SET @data = '{ "Person": { "Name": "Homer", "Hobbies": ["Eating", "Sleeping"] } }'; SELECT JSON_ARRAY_APPEND(@data, '$.Person.Hobbies[0]', "Drinking") AS 'Result';
Výsledek:
+--------------------------------------------------------------------------------+ | Result | +--------------------------------------------------------------------------------+ | {"Person": {"Name": "Homer", "Hobbies": [["Eating", "Drinking"], "Sleeping"]}} | +--------------------------------------------------------------------------------+