一、MySQL和PostgreSQL
MySQL和PostgreSQL中,=
和is null
不同,=
的对立面是!=
,is null
的对立面是is not null
,因此!= true
的查询结果只有= false
的部分,而不包括is null
的部分。
1、boolean类型(bool)
-- bool类型不等于true的为啥取的结果是等于false的记录,而没有值为null的记录
select * from ods.ods_table where is_deleted != 't';
-- 正确写法
select * from ods.ods_table where is_deleted = 'f' or is_deleted is null;
-- 字段有 null 值的要特别小心,用 = 和 is null 或 not is null 得到的结果不同。
2、varchar类型
有null也是一样的判断,在使用=
和is null
要分开考虑。过滤条件与字段所属数据类型无关,与=
和is null
的对立面不同有关,不管是何种数据类型,都要小心有null的字段。平时要注意:查询时不能用等于null,更新时可以用等于null。
二、MongoDB
测试工具:Studio 3T for MongoDB
测试集:创建一个collection:is_deleted_test
测试数据:通过Ctrl+D 添加document到mongo测试集,测试数据如下:
{
"_id" : ObjectId("6441da6b16f86a1a302516ac"),
"company_num_id" : 123.0,
"is_deleted" : false
}
{
"_id" : ObjectId("6441da7916f86a1a302516ad"),
"company_num_id" : 456.0,
"is_deleted" : true
}
{
"_id" : ObjectId("6441da9616f86a1a302516ae"),
"company_num_id" : 789.0,
"is_deleted" : null
}
{
"_id" : ObjectId("6441da9d16f86a1a302516af"),
"company_num_id" : 1024.0
}
先测试不等于true
的查询结果,Query如下:
{is_deleted:{$ne:true}}
查询结果如下:
{
"_id" : ObjectId("6441da6b16f86a1a302516ac"),
"company_num_id" : 123.0,
"is_deleted" : false
}
{
"_id" : ObjectId("6441da9616f86a1a302516ae"),
"company_num_id" : 789.0,
"is_deleted" : null
}
{
"_id" : ObjectId("6441da9d16f86a1a302516af"),
"company_num_id" : 1024.0
}
可见mongodb的查询和mysql、postgresql还是有差别的。
{is_deleted:{$exists:false}}
{
"_id" : ObjectId("6441da9d16f86a1a302516af"),
"company_num_id" : 1024.0
}