我们有学生表,其中包含JSON数据' jsonData'柱(LONGTEXT)。 我们需要改变" isHandicapped"的价值。在json的领域。
结构:
{
"data": {
"schoolData": {
"studentListe": [
{
"student": {
"studentId": 111749,
"isHandicapped": false
}
}
],
},
}
}
旧数据:" isHandicapped":false
新价值:" isHandicapped":" NO"
这应该是条件更新,因为我们需要将值更改为
旧数据:" isHandicapped":true
新价值:" isHandicapped":" Ja"
表的主要字段是ID。
我得到了以下SQL查询,但无法理解如何添加条件更新,如果值为true,则将Ja替换为NO:
update Student
set data = JSON_SET(data, "'$."data"."schoolData"."studentListe"[*]."isHandicapped", "?")
where id = 2;
答案 0 :(得分:1)
以下update
语句可以解决这个问题:
UPDATE Student
SET $.isHandicapped= CASE
WHEN JSON_EXTRACT(data, "'$."data"."schoolData"."studentListe"[*]."isHandicapped")='false'
THEN 'NO'
ELSE 'Ja' end
WHERE id=2;
答案 1 :(得分:1)
这是提取该字段的方式:
select json_extract(data, '$.data.schoolData.studentListe[*].student.isHandicapped') from Student;
+-------------------------------------------------------------------------------+
| json_extract(data, '$.data.schoolData.studentListe[*].student.isHandicapped') |
+-------------------------------------------------------------------------------+
| [false] |
+-------------------------------------------------------------------------------+
您可以使用JSON_SET()为特定的数组成员0设置值:
update student set data = json_set(data, '$.data.schoolData.studentListe[0].student.isHandicapped', 'NO');
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
select json_extract(data, '$.data.schoolData.studentListe[*].student.isHandicapped') from Student;
+-------------------------------------------------------------------------------+
| json_extract(data, '$.data.schoolData.studentListe[*].student.isHandicapped') |
+-------------------------------------------------------------------------------+
| ["NO"] |
+-------------------------------------------------------------------------------+
但是您不能使用*
通配符来更新所有数组成员:
update student set data = json_set(data, '$.data.schoolData.studentListe[*].student.isHandicapped', '"NO"');
ERROR 3149 (42000): In this situation, path expressions may not contain the * and ** tokens or an array range.
这些天,我在Stack Overflow上看到了很多有关在MySQL中选择或修改JSON数据的问题。通常的答案是:
如果您需要选择或更新JSON文档中的字段,则不应以JSON格式存储数据。
如果您将数据存储在普通表和列中,则此类任务很容易解决:
UPDATE StudentListe
SET isHandicapped = 'NO'
WHERE studentId = 2;