14
回答
SQL过滤条件中,a_flag!='1'查不出来a_flag is null的情况,怎么办?

db2、mySQL 数据库中都有这个问题

问题现象:

SQL语句:select * from table where a_flag!='1';

a_flag有3种情况,1、0、null。

使用a_flag!='1'本意是想查出a_flag=‘0’以及a_flag is null的情况,

但事实上a_flag is null的记录并未被查出来。

为什么会这样?并且更重要的是,怎么解决呢?

ps:

我也知道a_flag=‘0’ or a_flag is null是可行的,但类似的过滤条件很多的话,SQL代码会变得臃肿而不可读,就像这样:

select * from table where (condition 1 or condition 2 or condition 3 ...)

能否写出类似下面的代码?--当然,必须要能查出条件字段为null的情况。

select * from table where not (condition 1 )



举报
itwriter
发帖于4年前 14回/1K+阅
共有14个答案 最后回答: 4年前

在数据库中, null 与任何值 都不 相等(=), 同时 也都 不 不相等(<>),  甚至 null 与 null 都不 相等(=), 也不 不相等(<>), 总而言之, 言而总之, 各种比较符合 都会 忽略值为null 的记录. 所以, 你查不出来.  

关于null,  只有两种情况: is null , is not null.

建议你给 a_flag 设置个 default 值 然后查询就方便些, null 在查询中很不方便,特别是sql 语句的组织上

引用来自“抓瓦工人”的评论

建议你给 a_flag 设置个 default 值 然后查询就方便些, null 在查询中很不方便,特别是sql 语句的组织上

很有用的建议。不过,尽管是这样,多表外连接查询时,往往也避免不了许多字段为null的情况。
null还真是个麻烦的小东西。

null是特殊值,相当于js中的undefined。也许可以这么理解:无论作何种运算(除了is),null在过滤条件中的运算返回结果都为false,所以null(a_falg)!=0也会返回false。

不过,貌似没有很好的办法解决这个问题,这真是令人悲伤。

顶部