全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-20 6 分钟 ✍️ juanwangdev

choose-when-otherwise 分支

<choose> 标签结合 <when><otherwise> 实现多分支条件选择,类似 Java 的 switch-case-default 结构,按优先级匹配,仅执行第一个为 true 的分支。

基本语法

XML
<choose>
    <when test="条件1">分支1</when>
    <when test="条件2">分支2</when>
    <otherwise>默认分支</otherwise>
</choose>

按顺序判断 when,命中第一个后停止,不继续匹配。

排序字段选择

根据传入参数选择不同排序方式:

XML
<select id="findUser" resultType="User">
    SELECT * FROM user
    <where>
        <if test="status != null">status = #{status}</if>
    </where>
    <choose>
        <when test="sortBy == 'age'">ORDER BY age</when>
        <when test="sortBy == 'name'">ORDER BY name</when>
        <when test="sortBy == 'date'">ORDER BY create_time</when>
        <otherwise>ORDER BY id</otherwise>
    </choose>
</select>

传入 sortBy='age' 时,仅执行 ORDER BY age,后续 when 不判断。

搜索条件优先级

多字段搜索,按优先级匹配:

XML
<select id="searchUser" resultType="User">
    SELECT * FROM user
    <where>
        <choose>
            <when test="id != null">id = #{id}</when>
            <when test="email != null">email = #{email}</when>
            <when test="phone != null">phone = #{phone}</when>
            <when test="name != null">name LIKE CONCAT('%', #{name}, '%')</when>
            <otherwise>1 = 0</otherwise>
        </choose>
    </where>
</select>

优先级:id > email > phone > name,匹配到第一个就停止。

分页查询兼容

不同数据库分页语法不同,使用 choose 做兼容:

XML
<select id="findUser" resultType="User">
    SELECT * FROM user
    <where>
        <if test="status != null">status = #{status}</if>
    </where>
    <choose>
        <when test="dbType == 'oracle'">
            <![CDATA[
                WHERE ROWNUM <= #{limit}
            ]]>
        </when>
        <when test="dbType == 'sqlserver'">
            OFFSET #{offset} ROWS FETCH NEXT #{limit} ROWS ONLY
        </when>
        <otherwise>
            LIMIT #{limit} OFFSET #{offset}
        </otherwise>
    </choose>
</select>

与多个 if 的区别

多个 if 并列执行,choose 仅选其一:

结构执行方式适用场景
多个 <if>全部判断,true 的都执行可选条件叠加
<choose>选第一个 true,停止互斥条件,单选
XML
<!-- 多个 if:可叠加 -->
<if test="name != null">AND name LIKE #{pattern}</if>
<if test="age != null">AND age = #{age}</if>
<!-- 两个条件都满足时都执行 -->

<!-- choose:单选 -->
<choose>
    <when test="type == 'name'">AND name LIKE #{pattern}</when>
    <when test="type == 'age'">AND age = #{age}</when>
</choose>
<!-- 只选一个分支 -->

嵌套使用

choose 内部可嵌套其他动态标签:

XML
<choose>
    <when test="searchType == 'advanced'">
        <if test="name != null">name LIKE #{pattern}</if>
        <if test="age != null">AND age = #{age}</if>
        <if test="email != null">AND email = #{email}</if>
    </when>
    <when test="searchType == 'simple'">
        name LIKE #{pattern} OR email LIKE #{pattern}
    </when>
    <otherwise>
        1 = 1
    </otherwise>
</choose>

注意事项

  • choose 内必须至少有一个 when,otherwise 可选
  • when 按书写顺序从上到下判断,优先级由位置决定
  • 一旦命中某个 when,后续 when 和 otherwise 全部跳过
  • otherwise 是兜底,所有 when 为 false 时才执行

要点总结

  • choose-when-otherwise 类似 switch-case-default,按顺序匹配,仅执行第一个 true 分支
  • 适用于互斥条件选择,如排序字段切换、搜索方式选择、数据库兼容
  • 与多个 if 的区别:if 可叠加执行,choose 单选其一
  • otherwise 为可选兜底,所有 when 不满足时执行
  • when 内部可嵌套 if、bind、trim 等其他动态标签

📝 发现内容有误?点击此处直接编辑

← 上一篇 bind 变量绑定
下一篇 → foreach 循环遍历
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库