【问题标题】:MySQL JSON_MERGE / REPLACE. How to actually update values and not mergeMySQL JSON_MERGE / 替换。如何实际更新值而不是合并
【发布时间】:2018-02-02 11:11:55
【问题描述】:

我想做什么,但我想这是不可能的:

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

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

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

JSON_MERGE 函数,但这不是我想要的,但除此之外,这是我喜欢使用的语法。

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

【问题讨论】:

  • 试试:JSON_SET(),见db-fiddle
  • 谢谢,但我知道这个功能。这不是我想做的。我想发送纯 JSON。
  • 有了可用的 JSON 函数,要实现你所需要的并不容易。如果纯 JSON 始终只有一个键,您可以尝试db-fiddle 之类的方法,如果您的纯 JSON 中有多个键,则需要更复杂的东西来实现您的目标。
  • Dude wtf,你是我的英雄 :) ...我只是通过先删除然后合并的相同想法“解决”了这个问题,但我在后端代码中生成了删除函数字符串,而不是直接用mysql。您的解决方案要好一级。太感谢了!如果您想获得此答案的声誉,请随时添加答案,我会接受。否则,我将创建答案以使解决方案更好地被其他人看到。

标签: mysql sql json mariadb


【解决方案1】:

有了JSON Functions,要实现您的需要并不容易。如果纯 JSON 始终只有一个键,您可以尝试以下方法(在 MySQL 5.7.19 上测试):

SET
  @`json` := '{"de": "hi wie gehts?", "en": "hi, how are you?"}',
  @`plain_json` := '{"en": "hi, how are you!?"}';

SELECT
  JSON_MERGE(
    JSON_REMOVE(
      @`json`,
      CONCAT('$.',
             JSON_EXTRACT(
               JSON_KEYS(@`plain_json`),
               '$[0]'
            )
      )
    ),
    @`plain_json`
  ) AS `update`;

这会导致:

+----------------------------------------------------+
| update                                             |
+----------------------------------------------------+
| {"de": "hi wie gehts?", "en": "hi, how are you!?"} |
+----------------------------------------------------+

如果您的纯 JSON 中有多个键,您将需要更复杂的东西来实现您的目标。

db-fiddle

【讨论】:

  • 你能想到任何递归工作的版本吗?例如,如果需要替换 '$.en.greeting',而不是 '$.en'
  • @piojo:我不完全理解你的问题,比如db-fiddle?.
  • 我的意思是一个将合并的函数,但是当父子节点都存在键并且值不是对象/数组时,将采用第二个值。就像来自 MySQL 的 JSON_MERGE_PATCH 或来自 this answerjsonb_recursive_merge。您链接的函数为输入 @json := '{"A1": {"B1": "OLD DATA 2"}}'@plain_json := '{"A2": "new data 1", "A1": {"B1": "new data 2"}}' 创建了一个数组,尽管它适用于其他一些情况。 (请注意,我已经切换到 MySQL,但这似乎是 MariaDB 中的一个重要问题。)
  • @piojo:如果 MariaDB 不包含 MySQL 的 JSON_MERGE_PATCH()JSON_MERGE_PRESERVE() 函数,则需要做一些更复杂的事情来获得相同的行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-14
  • 1970-01-01
  • 1970-01-01
  • 2022-08-16
  • 1970-01-01
  • 2021-08-13
相关资源
最近更新 更多