CASE xxx WHEN 是 MySQL 的 CASE 语句中的一种写法,用于在条件满足时返回对应的值。语法格式如下:
CASE value
WHEN compare_value1 THEN result1
WHEN compare_value2 THEN result2
...
[ ELSE resultN ]
END;
其中,value 是需要比较的值,可以是字段名、变量、表达式等;compare_value1、compare_value2 等是需要比较的值,可以是常量、表达式等;result1、result2 等是对应比较值相等时返回的结果;ELSE resultN 是可选的,表示当没有任何一个比较值与 value 相等时返回的结果。如果没有 ELSE 子句,当没有任何一个比较值与 value 相等时返回 NULL。
在 MyBatis 的 标签中使用 CASE id WHEN,是为了在更新 my_table 表的 status 字段时,只更新传入的对象列表中指定的记录,避免将不需要更新的记录也一并更新。具体实现方式是,将传入的对象列表中的每个对象的 id 和 status 映射到 SQL 语句中的 WHEN 子句中,只有当当前记录的 id 与传入的对象列表中的某个 id 相等时,才将对应的 status 值更新到数据库中。当不满足任何一个 WHEN 子句时,将使用 ELSE status 子句返回原始的 status 值,避免对不需要更新的记录进行误操作。
例如,假设有一个 my_table 表,包含 id 和 status 两个字段,其中有三条记录:
如果传入的对象列表中包含以下两个对象:
List<MyEntity> list = new ArrayList<>();
list.add(new MyEntity(1, 3));
list.add(new MyEntity(4, 2));
那么生成的 SQL 语句将会是:
UPDATE my_table SET status =
CASE id WHEN 1 THEN 3 ELSE status END,
CASE id WHEN 4 THEN 2 ELSE status END
WHERE id IN (1, 4);
这个 SQL 语句的意思是,将 my_table 表中 ID 为 1 的记录的 status 值更新为 3,将 ID 为 4 的记录的
status 值更新为 2,不对 ID 为 2 和 3 的记录进行操作。程序中批量更新应用案例
<update id="updateListById">
UPDATE table_name
SET status =CASE id
<trim suffix="END">
<foreach collection="condition" item="item" index="index" >
WHEN #{item.id} THEN #{item.status}
</foreach>
</trim>
WHERE id IN
<foreach collection="condition" item="item" index="index" open="(" separator="," close=")">
#{item.id}
</foreach>
</update>
- 踩坑点:case的foreach里面不能使用separator=",”