1

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

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

我遇到的问题是,当我想在功能中插入实用程序对象时,我要么覆盖divisions键值,要么返回NULL并且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,
  }
}

divisionsutilities对象覆盖。

所以我正在尝试 JSON_INSERT 查询;从我从 mysql json 函数文档中收集到的内容应该可以工作,但它返回 null,我不明白为什么:

UPDATE entities SET config = JSON_INSERT(COALESCE(config, '{}'),
  COALESCE("$.features", "features"), JSON_OBJECT("utilities", 
  JSON_OBJECT("water", TRUE, "gas", TRUE, "electric", TRUE))) 
  WHERE id = 123725082;
4

1 回答 1

6

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

于 2017-11-01T07:55:26.630 回答