本文通过代码示例展示了SQL查询中null值在`in`和`not in`条件下的不同处理方式。`in`会忽略null值,而`not in`如果包含null,则会导致整个查询条件为false,返回空结果。
摘要由CSDN通过智能技术生成
一、直接上代码准备2个表的数据,表C:表D:select * from "C" where code in (select code from "D");结果如下select code from "D"这个语句的结果包含了null值,但是在in中,会自动忽略null值;select * from "C" where code not in (select code from "D");上面这个语句跑出来的结果是空,原因是not in中包含了null值,会直接返回false,导致整个whe
前一段时间在公司做一个小功能的时候,统计一下某种情况下有多少条数据,然后修改的问题,当时感觉很简单,写了一个如下的
SQL
:
SELECT COUNT(*) FROM t1 where tl.c1 not IN (SELECT t2.c1 FROM t2);
预期的结果是:有多少条数据在 t1
中
,同时不在 t2
中
,结果为:0,也就是 t1
中
数据都在 t2
中
,但是很容易就发现某些数据在 t1
中
不在 t2
中
,所以就感觉很奇怪,这个
SQL
看着也没问题啊。经过一番查询原来是因为 t2 的 c1 字段包含了
null
值
,修改如下两种形式都可以得到预期的结果:
SELECT COUN
原查询语句:
SELECT `DEVICE_NO`,`SYS_NO`,`STATION_NO` ,`DEVICE_NAME`,`DEVICE_TYPE_NO` FROM `dic_device`
WHERE `STATION_NO`=8
AND `DEVICE_NO` LIKE '%POWER%'
AND `DEVICE_TYPE_NO` NOT IN(SELECT `DEVICE_TYP...
insert into test_in(name, hobby, sex, school) values('张一','打球',1,'北京大学');
insert into test_in(name, hobby, sex, school) values('张二','看书',
null
,'清华大学');
insert into test_in(name, hobby, sex, school) values('张三','游泳',1,
null
);
insert
SELECT * FROM user WHERE password in (‘44’,
null
)
这样是无法将zhangsan 这条数据查出来但使用if
null
就能够解决这个问题
SELECT * FROM user WHERE IF
NULL
(password,‘’) in (‘44’,‘’)使用if
null
将
Null
值
转换成 空串’’ 然后
条件
添加空串就能将
null
值
查询出来
1)in的逻辑规则是or not in 的逻辑规则是 and
2)判断
null
的
sql
语句为 is not
null
或者 is
null
3)当遇到
null
=
null
的判断是时由于不符合
null
的判断规则,所以结果一定为flase
not in
中
包含
null
值
的情况
select *
from A
where A.name not in
(select B.name
from B )
在上面的not in的查询
中
如果B表的name字段.
Hive
中
的not in函数有一个隐藏的陷阱,当not in()
中
的数
值
包含
NULL
,匹不上的数据会返回
NULL
而不是True。
所以当在where
中
使用not in子查询进行筛选,一定要记得去除
NULL
值
。
样例代码:
--not in的原始结果
select num,num not in (
null
,'2'), num not in (
null
,'2') and true from
在Oracle
中
,使用NOT IN
NULL
和IN
NULL
时需要注意以下几点:
1. NOT IN
NULL
:如果NOT IN子句
中
包含
NULL
值
,则结果将不会包含任何行,即使与其他
值
匹配的行存在。
例如,假设我们有一个名为"customers"的表,其
中
包含以下数据:
| CustomerID | CustomerName |
| ---------- | ------------ |
| 1 | Alice |
| 2 | Bob |
| 3 |
NULL
|
如果我们运行以下查询:
SELECT CustomerName FROM customers WHERE CustomerName NOT IN ('Alice', 'Bob');
则查询结果将为空,因为
NULL
不等于任何
值
,包括
NULL
本身。
2. IN
NULL
:如果IN子句
中
包含
NULL
值
,则结果将包含所有行,即使与其他
值
不匹配的行也会包含。
例如,如果我们运行以下查询:
SELECT CustomerName FROM customers WHERE CustomerName IN ('Alice', 'Bob',
NULL
);
则查询结果将包含所有行,包括CustomerName为
NULL
的行。
因此,在使用NOT IN
NULL
和IN
NULL
时需要谨慎,确保理解它们的行为并正确使用它们。