如何使用 JSON_REPLACE 和 JSON_ARRAY 更改 MYSQL 数据库中 json 字段的数组值键?
How do I change an array-valued key of a json field in a MYSQL database using JSON_REPLACE and JSON_ARRAY?
我正在尝试更改 MySQL table.table 中名为 preferences 的 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`
问题是 religionPreferences 数组可以包含 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 有错误..
非常感谢。
-周杰伦
这是一个演示。首先我们设置一些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
视为字符串,并将其设置为“religions”键的值。这是默认设置,否则无法将值设置为恰好包含看起来像 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"]} |
+--------------------------------------------------------------+
我正在尝试更改 MySQL table.table 中名为 preferences 的 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`
问题是 religionPreferences 数组可以包含 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 有错误..
非常感谢。 -周杰伦
这是一个演示。首先我们设置一些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
视为字符串,并将其设置为“religions”键的值。这是默认设置,否则无法将值设置为恰好包含看起来像 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"]} |
+--------------------------------------------------------------+