如何在MySQL中的JSON条件更新字段?

时间:2017-02-16 03:32:57

标签: mysql sql json

我们有学生表,其中包含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;

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;