簡體   English   中英

mysql JSON_SET或JSON_INSERT函數將對象插入嵌套對象(如果存在)

[英]mysql JSON_SET or JSON_INSERT function to insert object into nested object if it exists

我有一個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,
  }
}

它用utilities對象覆蓋divisions

所以我正在嘗試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;

在這種情況下, 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM