not in 和 in的陷阱

2021-07-23 06:57:49 字數 2109 閱讀 8469

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]

goid name

001張三

002李四

003王五

create table [dbo].[table_b](

[id] [nchar](

10) null,

[name] [nchar](

10) null

) on [primary]

goid name

null 張三

002李四

null 王五

select

*from dbo.table_a as

awhere 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(*)之外。

--

正確寫法

select

*from dbo.table_a as

awhere a.id not

in ( select

b.id

from dbo.table_b as

b

where b.id is

notnull ) --

排除null值參與運算子比較

--建議修改為關聯查詢方法

--正確寫法1

select

*from dbo.table_a as

awhere

notexists ( 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

SQL陷阱 in與not in不是相反的

在sql中,邏輯值與其他程式語言不同,其他程式語言往往只有true和false,而在sql中,還多了乙個值unknown,當與null進行比較時會出現這種值,如 1 null 結果為unknown。下面看看維基百科的詳細說明。資料庫查詢語言sql實現三值邏輯作為處理null欄位內容的一種方式。sql...

not in 和 not exists的區別

在使用not in時,要注意null值。當試著使用 not in 子句查詢檢索存在於 dept表卻不存在於new dept表的deptno 會出現查不出資料。select from dept where deptno not in select deptno from new dept deptno...

替代not in 和 in 的辦法

在程式中,我們經常會習慣性的使用in和not in,在訪問量比較小的時候是可以的,但是一旦資料量大了,我們就推薦使用not exists或者外連線來代替了。如果要實現一張表有而另外一張表沒有的資料時,我們通常會這麼寫 select from table t where t.id not in sel...