[英]SQL Server 2008 not in null
我有一個奇怪的錯誤,我做了類似以下的事情:
SELECT *
FROM table1
WHERE NAME COLLATE LATIN1_General_CI_AS NOT IN (select name FROM table2)
Name
是nvarchar(50)
null
。 Table2
在name
列中具有null
值。 然后它會匹配table2
不存在的名稱,因為它們是null
值。 意味着這將返回0
結果。 如果我做了:
SELECT *
FROM table1
WHERE NAME COLLATE LATIN1_General_CI_AS NOT IN (
select name FROM table2 where name is not null
)
我會得到一些結果。
一張表有整理Danish_Norwegian_CI_AS
,另一張表有latin1
。 也許COLLATE
是問題的根源?
誰能解釋為什么會這樣? 也許是集合論的東西?
在NOT IN
或NOT EXISTS
表達式中使用NULL
不起作用。
基本上,如果子集包含NULL
,則SQL Server無法確定某些內容不在子集中,因為NULL
是具有未知值的狀態。
我不認為整理甚至進入它,查詢是不同的。
我想我會通過使用來解決這個問題
SELECT *
FROM table1 t1
WHERE NOT EXISTS ( SELECT *
FROM table2 t2
WHERE (t1.NAME COLLATE LATIN1_General_CI_AS = t2.name)
OR (t1.NAME IS NULL AND t2.name IS NULL))
雖然沒有花哨的理論,只有實踐經驗= P
它與排序規則無關。 嘗試set ansi_nulls off
,第一個查詢將按預期工作。
原因是當您嘗試將某些內容與NULL進行比較(例如a = NULL或<> NULL)時,結果為UNKNOWN,整個查詢失敗。 如果將ansi_nulls
設置為off
則相同的比較計算結果為TRUE或FALSE,並且查詢“正常”。
換一種說法:
WHEN a NOT IN (1, 2, null)
手段
WHEN a <> 1 AND a <> 2 AND a <> null
最后一部分a <> null
計算到UNKNOWN,查詢無法返回任何行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.