Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 Where子句有时过滤空值,但有时不过滤空值_Sql Server 2008_Null_Where Clause - Fatal编程技术网

Sql server 2008 Where子句有时过滤空值,但有时不过滤空值

Sql server 2008 Where子句有时过滤空值,但有时不过滤空值,sql-server-2008,null,where-clause,Sql Server 2008,Null,Where Clause,有人能解释一下为什么我对这两个相似的查询有两个不同的结果吗 例如: -- 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 NVARCHA

有人能解释一下为什么我对这两个相似的查询有两个不同的结果吗

例如:

-- 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

谢谢

如果使用set ansi nulls off(设置ansi nulls为关闭状态)与ansi nulls(设置ansi nulls为打开状态)时得到的结果不同

不同的结果是什么意思?我在两个查询中得到相同的一行结果0。正如我所期待的那样。起初我认为这是一个空值问题尝试将ansi nulls设置为off。如果在执行第一次选择之前将ansi_nulls设置为off,我将得到两个不同的结果。对我来说,第一个是好的,或者至少是我期望的结果。因此,在我的源表中,我有3个值NULL,0和1,我希望所有值都不同于'1'NULL和0。第一个给了我这个结果,但是第二个只给了我“0”并且忽略了空值。是的,你是对的。当ansi为空时,它处于启用状态,则两个查询的结果相同;当它处于禁用状态时,则结果不同。对我来说,当它关闭时,我应该得到同样的结果。例如,当它关闭时,我想得到以下结果:结果1和2->NULL和0换言之,我想得到与“1”不同的所有值。然后需要启用ansi nulls,或者需要在代码中专门包含nulls。启用ansi nulls对我不起作用,因为它排除了NULL值,我知道我可以将WHERE子句t1放入。a“1”或t1.a为NULL,但我认为这不是一个解决方案,只是一个变通方法。我想在其中写入t1.a“1”,结果也是NULL。但我在这个论坛上写作的主要原因是,我不知道为什么t1.a'1'返回的结果与t1.a@varname使用ANSI_为空时返回的结果不同。