MySQL JSON_MERGE / REPLACE。如何实际更新值而不是合并

时间:2017-08-24 14:07:47

标签: mysql sql json mariadb

我想做什么,但我猜它有些不可能:

我在一列中有JSON数据用于保存翻译。例如列描述值:{"de": "hi wie gehts?", "en": "hi, how are you?"}

现在我想只更新"en"属性。我知道JSON_REPLACE可以实现它,但它有一个奇怪的语法,我必须首先生成SQL代码才能实现这一点。

我正在寻找的是发送{"en": "hi, how are you!?"}的可能性,然后它应保留"de"属性并仅更新"en"属性。

JSON_MERGE功能,但这不是我要找的,但除此之外,这就是我喜欢使用的语法。

是否有一些嵌套mysql函数的解决方法?

1 个答案:

答案 0 :(得分: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