2014-02-28 43 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