我正在嘗試更改 MySQL 表中名為首選項的 JSON 欄位的陣列值鍵之一(稱為宗教)。
我沒有使用 JSON_ARRAY_APPEND,因為該欄位中的更改可能是任意的,并且可能涉及洗掉和添加。
現在我正在嘗試使用以下查詢來更改它。
const religionPreferences = ["Buddhism","Christianity","Non religious"]
const sql = `UPDATE users SET preferences = JSON_REPLACE(
preferences,
'$.${key}',
JSON_ARRAY(religionPreferences[0], religionPreferences[1], religionPreferences[2])
)
WHERE id = "${req.params.id}" LIMIT 1`
問題是宗教首選項陣列可以有 0-14 個元素,我不確定如何處理必須傳遞到 JSON_ARRAY 函式的變數引數。
const religionPreferences = ["Buddhism","Christianity","Non religious"]
const sql = `UPDATE users SET preferences = JSON_REPLACE(
preferences,
'$.religions',
JSON_ARRAY(religionPreferences[0], religionPreferences[1], religionPreferences[2])
)
WHERE id = "${req.params.id}" LIMIT 1`
我嘗試的另一種方法是直接將 JSON_REPLACE 的引數設定為陣列文字,而不是傳入 JSON_ARRAY,如下所示。
const religionPreferences = ["Buddhism","Christianity","Non religious"]
const sql = `UPDATE users SET preferences = JSON_REPLACE(
preferences,
'$.religions',
${religionPreferences}
)
WHERE id = "${req.params.id}" LIMIT 1`
問題是我希望它被保存為
religions: ["Christian","Buddhist","Other"]
代替
religions: '["Christian","Buddhist","Other"]'
但是當我試圖將它直接保存為一個沒有引號的陣列時,它說 SQL 有一個錯誤..
非常感謝。-杰
uj5u.com熱心網友回復:
這是一個演示。首先我們設定一些 JSON 檔案進行測驗。
mysql> set @j = '{"religions": []}';
Query OK, 0 rows affected (0.00 sec)
mysql> set @r = '["Buddhism","Christianity","Non religious"]';
Query OK, 0 rows affected (0.00 sec)
您不想要的是將其@r視為字串,并將其設定為“宗教”鍵的值。這是默認設定,否則將無法將值設定為恰好包含看起來像 JSON 檔案的字符的字串。
mysql> select json_replace(@j, '$.religions', @r);
--------------------------------------------------------------------
| json_replace(@j, '$.religions', @r) |
--------------------------------------------------------------------
| {"religions": "[\"Buddhism\",\"Christianity\",\"Non religious\"]"} |
--------------------------------------------------------------------
1 row in set (0.00 sec)
但是,如果您將值顯式轉換為 JSON 檔案,那么您就可以做您想做的事。它將“religions”鍵的值設定為 JSON 陣列。
mysql> select json_replace(@j, '$.religions', cast(@r as json));
--------------------------------------------------------------
| json_replace(@j, '$.religions', cast(@r as json)) |
--------------------------------------------------------------
| {"religions": ["Buddhism", "Christianity", "Non religious"]} |
--------------------------------------------------------------
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/324277.html
標籤:mysql mysql-json
