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

나도. 처음에는 Null <> Null 질문이라고 생각했습니다. –

답변

0

ansi nulls가 설정된 경우보다 ansi nulls off가 설정된 경우 결과가 달라집니다.

+0

네, 맞습니다. ansi nulls가있는 경우 두 쿼리에서 모두 동일한 결과를 얻습니다. 사용하지 않으면 결과가 다릅니다. 나를 위해, 나는 꺼져있을 때 같은 결과를 얻어야한다. 예를 들어, 꺼져있을 때 나는 이것을 얻고 싶었습니다 : 결과 1과 2 -> NULL과 0 다른 말로하면, 모든 값을 '1'과 다르게하고 싶었습니다. – Escaleira

+0

그런 다음 ansi nulls가 필요하거나 특별히 코드에 null을 포함해야합니다. – HLGEM

+0

ansi nulls on은 NULL 값을 제외하고 "t1.a <> '1'또는 t1.a IS NULL"WHERE 절을 넣을 수 있기 때문에 나를 위해 작동하지 않습니다.하지만 나는 그것이 아닌 것으로 생각합니다. 솔루션은 단지 일시적인 해결책 일뿐입니다. "WHERE t1.a <> '1'"을 쓰고 그 결과로 NULL을 갖고 싶습니다. 그러나이 포럼에서 쓴 이유는 "왜 t1.a <> '1'"이 다른 결과를 반환하는지 "WHERE t1.a <> @varname"(ANSI_NULLS OFF 사용). – Escaleira

관련 문제