mybatis case when

在MyBatis中,CASE WHEN语句用于在SQL查询中进行条件判断,类似于其他编程语言中的if/else语句。以下是CASE WHEN在MyBatis中的基本用法:

简单CASE函数

SELECT
  id,
  name,
  age,
  CASE
    WHEN age >= 18 THEN '成年'
    ELSE '未成年'
  END AS age_group
FROM
  user

CASE搜索函数

SELECT
  id,
  name,
  age,
  CASE
    WHEN sex = '1' THEN '男'
    WHEN sex = '2' THEN '女'
    ELSE '其他'
  END AS gender
FROM
  user

注意事项

  • CASE语句只返回第一个符合条件的值,如果存在多个WHEN条件,后面的条件将被忽略。

  • 在MyBatis的XML映射文件中直接使用CASE WHEN可能会遇到语法错误,特别是当涉及到复杂的逻辑时。在这种情况下,可以考虑使用MyBatis Plus的@SqlParser注解来解决解析问题。

  • CASE语句与联查表一起使用时,需要注意联查表可能没有数据的情况,这可能导致CASE语句中的某些字段无法赋值,进而影响查询结果。

示例:批量更新

update product
set
  name = CASE id
    WHEN 901 THEN '啊啊啊'
    WHEN 902 THEN NULL
  END,
  stock = CASE id
    WHEN 901 THEN NULL
    WHEN 902 THEN 100
  END
WHERE
  id IN (901, 902);

为了避免因部分字段为空而导致数据置空的问题,可以在then后面加上IFNULL判断,如果为空则保持原值不变。

示例:动态SQL构建

<select id="selectUsersByAgeGroup" resultMap="userResultMap">
  SELECT
    id,
    name,
    age,
    CASE
      WHEN age >= 18 THEN '成年'
      ELSE '未成年'
    END AS age_group
  FROM
    user
</select>

在使用CASE WHEN进行条件筛选时,如果遇到语法错误,请确保SQL语句在MySQL命令行中能够正确执行,并且检查MyBatis映射文件中的语法是否正确。

Top