MariaDB中对比含NULL值的属性为何返回空结果?
问题原因解析
这是因为SQL中NULL的比较逻辑特性导致的:
- 在MariaDB(以及所有遵循SQL标准的数据库)中,
NULL代表未知值,它和任何值(包括另一个NULL)进行比较时,结果既不是TRUE也不是FALSE,而是UNKNOWN。 - 你的
WHERE子句cast(CONTENTLENGTH as decimal)<>b.BLENGTH里,b.BLENGTH全为NULL,所以这个比较表达式的结果永远是UNKNOWN。而WHERE只会保留结果为TRUE的行,UNKNOWN的行会被直接过滤,最终返回空集。
如果要找出所有CONTENTLENGTH转成decimal后与BLENGTH不匹配(包括BLENGTH为NULL的情况),可以修改条件:
select a.ID,a.CONTENTLENGTH,b.BLENGTH from a inner join b on a.ID=b.ID where cast(CONTENTLENGTH as decimal) <> b.BLENGTH OR b.BLENGTH IS NULL;
或者使用MariaDB支持的IS NOT DISTINCT FROM运算符(它会将NULL视为可比较的相等值):
select a.ID,a.CONTENTLENGTH,b.BLENGTH from a inner join b on a.ID=b.ID where cast(CONTENTLENGTH as decimal) IS NOT DISTINCT FROM b.BLENGTH;
内容的提问来源于stack exchange,提问作者Jochen
相关产品推荐
相关产品推荐

