如何在HQL的WHERE子句中用CASE WHEN处理字段空值关联判断
用HQL的CASE WHEN实现双表字段校验逻辑
这需求很常见,用CASE WHEN完全可以搞定,我给你写个实际可运行的HQL示例,再一步步拆解逻辑:
核心实现代码
假设你是通过某个关联字段(比如t1.t2_id = t2.id)关联两张表,最终的WHERE条件可以这么写:
SELECT t1.*, t2.* FROM table1 t1 INNER JOIN table2 t2 ON t1.t2_id = t2.id WHERE CASE -- 当table1.field1为空时,校验table2.field1也必须为空 WHEN t1.field1 IS NULL THEN t2.field1 IS NULL -- 当table1.field1有有效值时,校验两个字段值相等 ELSE t1.field1 = t2.field1 END
逻辑拆解
这个CASE WHEN语句的执行逻辑非常直观:
- 首先判断
t1.field1是否为NULL:- 如果是,就返回
t2.field1 IS NULL的布尔结果——只有当t2.field1也为空时,这个条件才会成立,否则过滤掉这条数据 - 如果不是,就返回
t1.field1 = t2.field1的布尔结果——只有两个字段值完全相等时,才会保留这条数据
- 如果是,就返回
补充说明
其实不用CASE WHEN,用逻辑运算符组合也能实现同样效果(适合不想用CASE的场景):
WHERE (t1.field1 IS NULL AND t2.field1 IS NULL) OR (t1.field1 IS NOT NULL AND t1.field1 = t2.field1)
不过既然你明确要求用CASE WHEN,那第一种写法就完全符合你的需求啦。
内容的提问来源于stack exchange,提问作者N. Var
相关产品推荐
相关产品推荐

