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...