簡體   English   中英

SQL Server 2008不為空

[英]SQL Server 2008 not in null

我有一個奇怪的錯誤,我做了類似以下的事情:

SELECT *
FROM table1
WHERE NAME COLLATE LATIN1_General_CI_AS NOT IN (select name FROM table2)

Namenvarchar(50) null Table2name列中具有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 INNOT EXISTS表達式中使用NULL不起作用。

基本上,如果子集包含NULL ,則SQL Server無法確定某些內容不在子集中,因為NULL是具有未知值的狀態。

我不認為整理甚至進入它,查詢是不同的。

請在NOT IN查看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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM