mysql JSON_SET或JSON_INSERT函数,用于将对象插入嵌套对象(如果存在)

时间:2017-10-31 19:37:31

标签: mysql json object mysql-json

我有一个json类型列config我想添加一个键值对,最终看起来像:

{
  "features": {
    "divisions": true,
    "utilities": {
        "water": true,
        "gas": true,
        "electric": true
    }
  }
}

我遇到的问题是当我想在功能中插入实用程序对象时,我要么覆盖divisions键值,要么我返回NULL并且<{1}}对象未被插入。

此外,utilities列可能是config或最初只是空NULL

此查询将检查NULL或空{}以及{}密钥是否存在但如果已存在则会覆盖features

features

除非该列已经包含以下内容:

,否则此工作正常
UPDATE entities SET config = JSON_SET(COALESCE(config, '{}'),
  COALESCE("$.features", "features"), JSON_OBJECT("utilities", 
  JSON_OBJECT("water", TRUE, "gas", TRUE, "electric", TRUE))) 
  WHERE id = 123725082;

在其中用{ "features": { "divisions": true, } } 对象覆盖divisions

所以我尝试了一个JSON_INSERT查询;从我从mysql json函数文档中收集的文档应该可以工作,但是它返回null并且我无法理解为什么:

utilities

1 个答案:

答案 0 :(得分:4)

在这种情况下,

JSON_MERGE函数非常有用。

根据需要修改UPDATE

UPDATE `entities`
  SET `config` = COALESCE(
    JSON_MERGE(
      `config`,
      JSON_OBJECT('features',
        JSON_OBJECT('utilities',
          JSON_OBJECT('water', TRUE, 'gas', TRUE, 'electric', TRUE)
        )
      )
    ),
    JSON_INSERT(
      JSON_OBJECT(),
      '$.features',
       JSON_OBJECT('utilities',
         JSON_OBJECT('water', TRUE, 'gas', TRUE, 'electric', TRUE)
       )
    )
  );

请参阅db-fiddle