Sql server SQL Server返回不相等的行<&燃气轮机;设置为一个值并为NULL

Sql server SQL Server返回不相等的行<&燃气轮机;设置为一个值并为NULL,sql-server,null,Sql Server,Null,我有一个表,其中有一列值可以是rowTypeID=(1、2、3或null)。我想写一个查询,返回任何没有值3的行。在本例中,我需要所有空行以及所有1,2行,但不需要值为3的行 当前为数据库设置了Set ANSI null ON 我很好奇为什么我不会写字 select * from myTable where myCol <> 3 从myCol 3所在的myTable中选择* 此查询不会返回mycl列中包含NULL的任何行 我得写信 select * from my Table w

我有一个表,其中有一列值可以是rowTypeID=(1、2、3或null)。我想写一个查询,返回任何没有值3的行。在本例中,我需要所有空行以及所有1,2行,但不需要值为3的行

当前为数据库设置了Set ANSI null ON

我很好奇为什么我不会写字

select * from myTable where myCol <> 3
从myCol 3所在的myTable中选择*
此查询不会返回mycl列中包含NULL的任何行

我得写信

select * from my Table where myCol <> 3 or myCol Is NULL 
从myCol 3或myCol为空的表中选择*

我是否必须始终包含IS NULL,或者我是否可以设置它,以便where子句myCol 3将返回具有NULL值的行作为我的列的值

,无论何时测试一个值,都会忽略所有NULL值–毕竟,您正在测试某些列中的值是否通过某些条件,并且NULL不是值。

您必须以某种方式处理NULL,因为表达式涉及
NULL
。如果您愿意,您可以改为:

select *
from MyTable
where isnull(MyColumn, -1) <> 3
选择*
从MyTable
其中isnull(MyColumn,-1)3
但是这涉及到一个神奇的数字(-1),并且可以说它的可读性不如原始测试的
为NULL


编辑:,正如SQLMENAGE指出的那样,它不是。

因为不能将NULL与其他任何东西进行比较,所以NULL甚至不等于NULL

DECLARE @i INT
DECLARE @i2 INT

SELECT @i = NULL, @i2 = NULL

IF @i = @i2
PRINT 'equal'
ELSE 
PRINT 'not equal'
我是否总是必须包含IS NULL,或者我是否可以设置它,以便where子句myCol 3将返回具有NULL值的行作为我的列的值

您总是,总是,总是必须包含
为空


因为3不等于不适用,也不等于未知。

我认为你的方法很好:

SELECT *
FROM MyTable
WHERE myCol <> 3 OR myCol IS NULL
然而,总的来说,我建议不要使用这种方法。你现在的做法是正确的

另外,值得一提的是,其他几个数据库支持的
不同,后者正好满足您的需要:

SELECT *
FROM MyTable
WHERE myCol IS DISTINCT FROM 3
MySQL具有以下功能,也可用于此目的:

SELECT *
FROM MyTable
WHERE NOT myCol <=> 3
选择*
从MyTable
哪里不是mycol3

不幸的是,SQL Server还不支持这两种语法。

NULL就是这样工作的,与之进行任何比较都是错误的,除了is NULL和is NOTNULL@kurosch:严格按照您的行,NULL=NULL也会返回false,因为这是一个比较?@Marcel:yes,NULL=NULL总是false,对于这个问题,NULL也是空的:-)从MyTable中选择*其中isnull(MyColumn,3)=3@SQLMenace:说得好,性能也会更差-我不推荐我的建议。@Yossarian-这比我的幻数版本好,但我仍然觉得可读性更差。我将坚持使用标准测试,测试
是否为NULL
。请在MS网站上升级此ISO功能,“独立谓词”:
SELECT *
FROM MyTable
WHERE NOT myCol <=> 3