2014-02-28 41 views
0

我用<>!=來測試SQL中的NOT EQUAL TO。我嘗試了下面的語法,除IS NOT NULL之外都失敗了。SQL正確檢查不等於NULL

什麼是檢查NOT EQUAL with NULL

declare @p1 int 
set @p1=null 

SELECT COUNT(*) 

FROM Emp_Details 

WHERE [source_id] IS NOT null -- gives 1289 records 


SELECT COUNT(*) 

FROM Emp_Details 

WHERE [source_id] != null -- gives 0 records 

SELECT COUNT(*) 

FROM Emp_Details 

WHERE [source_id] <> null -- gives 0 records 


SELECT COUNT(*) 

FROM Emp_Details 

WHERE [source_id] <> @p1 -- gives 0 records 

從不對我執行以下條件的正確方式,即使我通過0 or 1 for @p1

IF COALESCE (@p1, NULL) != NULL 
    BEGIN 
    DELETE 
    FROM @EmpDetailTable 
    WHERE [source_id] != @p1 
    END 

注:一些source_id數值是NULL

+6

顯然是給你的結果;) – Scoregraphic

+0

「不是NULL」或「IS NULL」是空值檢查 – Rodion

+0

NULL值是沒有值。 '<>'和'!='需要一個值,所以當與'NULL'比較時,它們評估爲'undefined'(false)。有關更多詳細信息,請查看[處理空值](http://msdn.microsoft.com/zh-cn/library/ms172138(v = vs.110).aspx)。 – wdosanjos

回答

2

IS NOT null是正確的方法。

由於this鏈接的Remarks部分表示「如果其中一個或兩個參數都爲NULL,比較運算符返回UNKNOWN」。所以我們不能依靠Comparison Operators

+0

爲什麼其他運算符如<>或!=不能使用? –

+1

@Murali:因爲SQL標準規定什麼都不等於NULL。 NULL不是一個值,因此無法進行比較。 – Tobberoth

+0

@Murali:我提供了鏈接到「微軟」網站的確切原因。 – Bharadwaj

0

您可以使用IS NOT null

To determine whether an expression is NULL, use IS NULL or IS NOT NULL instead 
of comparison operators, such as = or !=. Comparison operators return UNKNOWN 
if either or both arguments are NULL. 

declare @p1 int 
set @p1=null 

SELECT COUNT(*) 

FROM Emp_Details 

WHERE [source_id] IS NOT null 
1

你不能和NULL比較嘗試

select * where id = null 
select * where id != null 

以上回報的例子都行!

你必須使用IS NULL

select * where id is null 
select * where id is not null 

有一個關於空一個普遍的誤解。這並不意味着「無所謂」,意思是「我不知道,缺乏數據」,並且將英語翻譯爲「無論」或「任何」。

+0

+1 <>和!=運算符比較實際值。 NULL不是一個值,所以當它試圖比較時,它返回0個記錄。 NULL和''是兩個不同的東西。如果你正在使用'',你可以有!=和<> – user3036342

3

常見的方法來檢查,如果一個表達式不爲空,是IS NOT NULLIS NULL

WHERE (expression IS NOT NULL) 

或:

WHERE NOT (expression IS NULL) 

也有IS DISTINCT FROM運營商,但不是所有的DBMS已實施它:

WHERE (expression IS DISTINCT FROM NULL) 

代碼:

IF COALESCE (@p1, NULL) != NULL 
BEGIN 
DELETE 
FROM @EmpDetailTable 
WHERE [source_id] != @p1 
END 

,如果你的意思是,只有當@p1不是null執行,可以寫成如下:

IF @p1 IS NOT NULL 
BEGIN 
DELETE 
FROM @EmpDetailTable 
WHERE [source_id] != @p1 
END 
+0

更新我的問題與實際問題 – Billa

+0

我已經應用相同的邏輯到其他列過濾器,如'IF COALESCE(@p_status_id,NULL)!= NULL' all工作正常。與此列唯一的區別是它具有NULL值,其他列不具有NULL – Billa

+0

請您解釋這兩個條件過濾器的區別以及爲什麼我應該將'IS NOT NULL'僅應用於'source_id'? – Billa

0

你應該試試這個:

IF COALESCE(@p1, NULL) IS NOT NULL 
BEGIN 
    DELETE 
    FROM @EmpDetailTable 
    WHERE [source_id] != @p1 
END 
+1

恕我直言,'COALESCE(@ p1,NULL)'是毫無意義的,它相當於只是'@ p1'。 –

+0

你是對的,但我想盡可能少地修改他的代碼,而這一切都與這個非空值比較有關。所以我把它留在那裏,即使它在他的例子中是無用的。 – Scoregraphic