Sql server SQL Server返回不相等的行<&燃气轮机;设置为一个值并为NULL
我有一个表,其中有一列值可以是rowTypeID=(1、2、3或null)。我想写一个查询,返回任何没有值3的行。在本例中,我需要所有空行以及所有1,2行,但不需要值为3的行 当前为数据库设置了Set ANSI null ON 我很好奇为什么我不会写字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
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