2012-05-10 74 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

相關問題