2017-08-24 70 views
1

我想做什麼,但我想這是不可能的:MySQL JSON_MERGE/REPLACE。如何實際更新值,而不是合併

我在保存翻譯的列中有JSON數據。例如列描述值:{"de": "hi wie gehts?", "en": "hi, how are you?"}

現在我想只更新"en"屬性。我知道這可能與JSON_REPLACE但它有一個奇怪的語法,我必須首先生成SQL代碼才能做到這一點。

我所尋找的是剛剛送{"en": "hi, how are you!?"}的可能性,那麼就應該保持"de"財產,只更新"en"財產。

JSON_MERGE函數,但這不是我正在尋找的,但除此之外,這是我喜歡使用的語法。

是否有一些嵌套的mysql函數左右的解決方法?

+0

嘗試:['JSON_SET()'](https://dev.mysql.com/doc/refman/5.7/en/json-modification-functions.html#function_json-set),見[DB-撥弄] (https://www.db-fiddle.com/f/dat6HChx186UKWirCmdjrk/0)。 – wchiquito

+0

謝謝,但我知道這個功能。這不是我想要做的。我想發送普通的JSON。 – EscapeNetscape

+1

隨着JSON功能的推出,實現您所需的功能並不容易。如果普通的JSON總是有一個鍵,就可以嘗試像[DB-小提琴(https://www.db-fiddle.com/f/e6bpfVUoCy5W4UisbTF7hr/0),如果你在你的純多個關鍵JSON,你需要更復雜的東西來實現你的目標。 – wchiquito

回答

1

隨着12.16 JSON Functions的提供,實現你所需要的並不容易。如果普通的JSON總是有一個鍵,你可以嘗試這樣的:

mysql> SELECT VERSION(); 
+-----------+ 
| VERSION() | 
+-----------+ 
| 5.7.19 | 
+-----------+ 
1 row in set (0.00 sec) 

mysql> SET 
    -> @`json` := '{"de": "hi wie gehts?", "en": "hi, how are you?"}', 
    -> @`plain_json` := '{"en": "hi, how are you!?"}'; 
Query OK, 0 rows affected (0.00 sec) 

mysql> SELECT 
    -> JSON_MERGE(
    ->  JSON_REMOVE(
    ->  @`json`, 
    ->  CONCAT('$.', 
    ->    JSON_EXTRACT(
    ->    JSON_KEYS(@`plain_json`), 
    ->    '$[0]' 
    ->   ) 
    ->  ) 
    -> ), 
    ->  @`plain_json` 
    -> ) `UPDATE`; 
+----------------------------------------------------+ 
| UPDATE            | 
+----------------------------------------------------+ 
| {"de": "hi wie gehts?", "en": "hi, how are you!?"} | 
+----------------------------------------------------+ 
1 row in set (0.00 sec) 

如果你在你的純JSON多個鍵,則需要更復雜的東西來實現自己的目標。

參見db-fiddle

相關問題