oracle中,任何字符串與null比較得到的結果都是null,而 oracle的判斷條件為null時就退出判斷(?)
因此判斷某個字符串是否在一個集合中時,not in 和 in的結果完全不一樣,如
select * from airport_heliport t where t.airport_heliport_uuid in
(
select 'e6513669-8cb7-41d9-85af-11ab26930790' from dual
union
select null from dual
)
返回正常一條記錄,
而,將 in 改成 not in后,感覺應該返回多條記錄,但實際上返回空集合。
原因是:
in 判斷時,每條記錄與集合里的每一個記錄比較,只要有一條記錄比較相同,就返回true。所以,即使這個集合里有null,也不影響in的結果。
但not in就不一樣了,not in要與集合中每條記錄比較,每條記錄都不相同才返回true。當集合中包含null時,每條記錄與之比較都會退出,所以返回的集合也必定為null
因此,not in 判斷的集合不能包含null,而in判斷的集合可以包括null
此外,如果一個字段a可以取值 Y,N和null;如果要取出所有不為Y的記錄,不能寫成 where a<>'Y',這樣所有取值為null的記錄並不能返回,也不能寫成 where a in (null,'N'),同樣也取不到null的記錄
只能寫成
where nvl(a,'N') ='N' 或者
where a is null or a ='N'