sql 在not in 子查詢有null值情況下經常出現的陷阱
1、not in 和in 根據某個字段查詢如 not in('3'),查不出這個字段爲空的數據
2、not in 和 in 在 查詢時,條件裏不能存在null,如not in('',null,'3') 這樣子是查詢不出結果的
還有個陷阱是:
select count(1) from (MT_BDG_THREE1) where uuid in('437044e9-660c-401b-ba22-b8e0d695e057') and audit_state not in('3')
當表裏存在audit_state 爲空的數據時,這些數據無法查出來
1、在創建數據時audit_state 賦予初始值
2、nvl函數爲空值賦值,然後篩選
如果下:Table_A表和Table_B表,要求查詢出在Table_A表中不在Table_B表中的記錄。
CREATE TABLE [dbo].[Table_A]( [ID] [nchar](10) NULL, [Name] [nchar](10) NULL ) ON [PRIMARY] GO ID Name 001 張三 002 李四 003 王五 CREATE TABLE [dbo].[Table_B]( [ID] [nchar](10) NULL, [Name] [nchar](10) NULL ) ON [PRIMARY] GO ID Name NULL 張三 002 李四 NULL 王五
很容大家第一時間相當的寫法是:
SELECT * FROM dbo.Table_A AS a WHERE a.ID NOT IN ( SELECT b.ID FROM dbo.Table_B AS b)
然而查詢出來並沒有達到預期的
ID Name
001 張三
003 王五
原因很簡單:由於NULL不能進行如何的“操作”
–如果null參與算術運算,則該算術表達式的值爲null。(例如:+,-,*,/ 加減乘除)
–如果null參與比較運算,則結果可視爲false。(例如:>=,<=,<> 大於,小於,不等於)
–如果null參與聚集運算,則聚集函數都置爲null。除count(*)之外。
--如果在not in子查詢中有null值的時候,則不會返回數據。 (最簡單的解釋請參考下面的評論說明)
--正確寫法 SELECT * FROM dbo.Table_A AS a WHERE a.ID NOT IN ( SELECT b.ID FROM dbo.Table_B AS b WHERE b.ID IS NOT NULL ) --排除NULL值參與運算符比較 --建議修改爲關聯查詢方法 --正確寫法1 SELECT * FROM dbo.Table_A AS a WHERE NOT EXISTS ( SELECT * FROM dbo.Table_B AS b WHERE a.ID = b.ID ) --正確寫法2 SELECT * FROM dbo.Table_A AS a LEFT OUTER JOIN dbo.Table_B AS b ON a.ID = b.ID WHERE b.ID IS NULL