2012-05-10 51 views
0

有人可以解释为什么我对这两个类似查询有两个不同的结果吗?Where子句有时会过滤NULL值,但有时不会

例子:

-- Create table t1 and insert values. 
CREATE TABLE t1 (a NVARCHAR(4) NULL) 
INSERT INTO t1 values (NULL) 
INSERT INTO t1 values ('0') 
INSERT INTO t1 values ('1') 
GO 

PRINT 'Testing NULL values' 
DECLARE @varname NVARCHAR(4) 
SET @varname = '1' 

SELECT * 
FROM t1 
WHERE a <> @varname 

SELECT * 
FROM t1 
WHERE a <> '1' 
GO 

-- Drop table t1. 
DROP TABLE t1 

谢谢!

+1

你是什么意思由不同*结果*? – MilkyWayJoe

+1

我在两个查询中都得到相同的一行结果('0')。 (如我所料) –

+0

我也是。认为这是一个空值<>空值问题首先 –

回答

0

如果设置了ansi nulls off,那么我会得到不同的结果,而不是ansi nulls处于开启状态。

+0

是的,你是对的。 当两个查询中的ansi为空值时,在两个查询中都有相同的结果,当它关闭时,结果会不同。 对我来说,当它关闭时我应该得到相同的结果。 例如,当它关闭时,我想得到: 结果1和2 - > NULL和0 换句话说,我想要得到所有不同的'1'。 – Escaleira

+0

然后,您需要使用ansi nulls,否则您需要在代码中专门包含空值。 – HLGEM

+0

ansi nulls对我不起作用,因为它排除了NULL值,我知道我可以在WHERE子句中放入“t1.a <>'1'或t1.a IS NULL”但我认为这不是解决方案,只是一种解决方法。 我想写“WHERE t1.a <>'1'”并且结果为NULL。 但我在这个论坛写的主要原因是因为我不知道为什么“WHERE t1.a <>'1'”返回不同的结果,然后“WHERE t1.a <> @varname”(使用ANSI_NULLS OFF )。 – Escaleira

相关问题