温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

动态SQL怎么处理空值

发布时间:2026-07-14 09:53:13 来源:亿速云 阅读:95 作者:小樊 栏目:数据库

动态 SQL 中处理“空值(NULL)”是一个非常常见、也很容易踩坑的问题。不同技术栈处理方式略有差异,但核心思想一致:区分“未传条件”和“传了空值”,并据此决定是否拼接 SQL。

下面按常见场景系统说明。


一、通用原则(先记住这 3 点)

  1. NULL ≠ 空字符串

    • 数据库里:NULL 表示“没有值”
    • 空字符串 '' 是一个“有值的值”
  2. 动态 SQL 的目标

    • 没传条件 → 不拼 SQL
    • 传了条件 → 拼 SQL(包括 NULL)
  3. 判断顺序很重要

    是否传参?
      ├─ 没传 → 不拼
      └─ 传了 → 再判断是否为 NULL
    

二、MyBatis 中处理空值(最常见)

1️⃣ 基本写法(推荐)

<select id="queryUser" resultType="User">
  SELECT * FROM user
  WHERE 1 = 1
  <if test="name != null and name != ''">
    AND name = #{name}
  </if>
  <if test="status != null">
    AND status = #{status}
  </if>
</select>

✅ 要点:

  • 字符串:!= null and != ''
  • 数字 / 枚举:!= null 即可

2️⃣ 正确处理 NULL 参数(查询 NULL)

如果前端 明确传了 NULL,想查 status IS NULL

<if test="status == null">
  AND status IS NULL
</if>

⚠️ 注意:
status = null 在 SQL 中是 永远不成立 的。


3️⃣ 区分“未传”和“NULL”(高级)

Java 参数对象

public class UserQuery {
    private String name;      // null = 未传
    private Boolean queryNull; // true = 我要查 NULL
}

XML

<if test="queryNull != null and queryNull">
  AND status IS NULL
</if>
<if test="status != null">
  AND status = #{status}
</if>

✅ 这是最严谨的写法


三、动态 SQL 拼接时避免语法错误

❌ 错误示例

AND status = #{status}

status 为 NULL 时:

  • SQL 变成 status = null

✅ 正确写法

<choose>
  <when test="status == null">
    AND status IS NULL
  </when>
  <otherwise>
    AND status = #{status}
  </otherwise>
</choose>

四、JDBC / 原生 SQL 中的处理

错误

sql += " AND status = " + status;

正确(PreparedStatement)

if (status != null) {
    sql += " AND status = ?";
} else {
    sql += " AND status IS NULL";
}

五、数据库函数处理 NULL(补充)

COALESCE(常用)

SELECT * FROM user
WHERE COALESCE(status, 0) = 0;

⚠️ 会导致索引失效,不推荐用于大表


六、常见坑总结(重点)

问题 说明
= NULL ❌ 永远不成立
空字符串当 NULL ❌ 逻辑错误
不区分“未传”和“NULL” ❌ 查询条件错
动态 SQL 不判空 ❌ SQL 语法错误

七、一句话总结

动态 SQL 处理空值的核心:
先判断“参数是不是存在”,再决定是拼 = ? 还是 IS NULL,永远不要用 = NULL


如果你用的是 MyBatis / JPA / Spring Data / 某个具体数据库(Oracle / MySQL,可以告诉我,我可以给你更贴近你项目的示例。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI