我有一個表,其中有一個JSON名為people的列,如下所示:
| ID | 人們 |
|---|---|
| 1 | [{ "id": 6 }, { "id": 5 }, { "id": 3 }] |
| 2 | [{ "id": 2 }, { "id": 3 }, { "id": 1 }] |
...并且我需要更新people列并將 a0放在路徑$[*].idwhere 中id = 3,因此在執行查詢后,表應該像這樣結束:
| ID | 人們 |
|---|---|
| 1 | [{ "id": 6 }, { "id": 5 }, { "id": 0 }] |
| 2 | [{ "id": 2 }, { "id": 0 }, { "id": 1 }] |
每行可能有多個匹配項。
老實說,我沒有嘗試任何查詢,因為我不知道如何在欄位內回圈,但我的想法是這樣的:
UPDATE mytable
SET people = JSON_SET(people, '$[*].id', 0)
WHERE /* ...something should go here */
這是我的版本
SELECT VERSION()
-----------------
| version() |
-----------------
| 10.4.22-MariaDB |
-----------------
uj5u.com熱心網友回復:
如果 中的id值people是唯一的,您可以使用JSON_SEARCH和的組合JSON_REPLACE來更改值:
UPDATE mytable
SET people = JSON_REPLACE(people, JSON_UNQUOTE(JSON_SEARCH(people, 'one', 3)), 0)
WHERE JSON_SEARCH(people, 'one', 3) IS NOT NULL
請注意,該子句是必要的,以防止在由于回傳而找不到值時WHERE查詢替換值(這也會導致回傳)。NULLJSON_SEARCHNULLJSON_REPLACENULL
如果id值不是唯一的,您將不得不依賴字串替換,最好使用REGEXP_REPLACE來處理值中可能存在的間距差異(并且還避免替換3(例如)23或34:
UPDATE mytable
SET people = REGEXP_REPLACE(people, '("id"\\s*:\\s*)2\\b', '\\14')
dbfiddle 上的演示
uj5u.com熱心網友回復:
如官方檔案中所述,MySQL 將 JSON 格式的字串存盤在字串列中,因此您可以使用該JSON_SET函式或任何字串函式。
對于您的特定任務,應用REPLACE字串函式可能適合您的情況:
UPDATE
mytable
SET
people = REPLACE(people, 3, 0)
WHERE
....;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/454859.html
上一篇:如何將varchar2輸入引數轉換為存盤程序中的時間戳
下一篇:SQL多對一條件
