MySQL中基于NULL值关联两张表无法获取预期结果的问题
解决MySQL中NULL值关联匹配问题
MySQL中NULL与NULL的比较结果为NULL(逻辑上不相等),这导致你原有的LEFT JOIN条件无法匹配Student表中John的NULL状态与Status表中的NULL状态,从而得不到预期结果。以下是几种可行的解决方案:
方法1:扩展JOIN条件,显式匹配NULL
直接在JOIN条件中加入两边均为NULL的判断:
SELECT a.NAME, b.DESCRIPTION FROM STUDENT a LEFT JOIN STATUS b ON a.STATUS = b.STATUS OR (a.STATUS IS NULL AND b.STATUS IS NULL);
方法2:用COALESCE替换NULL为特殊值
将两边的NULL替换成一个业务中不会出现的特殊值,让它们能通过相等判断匹配:
SELECT a.NAME, b.DESCRIPTION FROM STUDENT a LEFT JOIN STATUS b ON COALESCE(a.STATUS, '__NULL__') = COALESCE(b.STATUS, '__NULL__');
注意:__NULL__需选用不会出现在STATUS字段中的值,避免与正常数据冲突。
方法3:使用IS NOT DISTINCT FROM(MySQL 8.0+)
MySQL 8.0及以上版本支持IS NOT DISTINCT FROM操作符,该操作符会将NULL视为相等:
SELECT a.NAME, b.DESCRIPTION FROM STUDENT a LEFT JOIN STATUS b ON a.STATUS IS NOT DISTINCT FROM b.STATUS;
以上三种方法执行后,均可得到预期结果:
| NAME | DESCRIPTION |
|---|---|
| Jason | Active |
| John | Inactive |
内容的提问来源于stack exchange,提问作者Jason Joel Pinto
相关产品推荐
相关产品推荐

