2010-12-15 3 views
17

rowTypeID = (1,2,3 또는 null) 일 수있는 값의 열이있는 테이블이 있습니다. 3 값이없는 모든 행을 반환하는 쿼리를 작성하고 싶습니다. 이 예제에서 모든 1,2 행과 함께 모든 NULL 행을 원합니다. 값 3 인 행을 원하지 않습니다.SQL Server return 값과 NULL이 같지 않은 행과 NULL

데이터베이스에 대해 ANSI null ON이 설정되어 있습니다. 내가

내가

select * from my Table where myCol <> 3 or myCol Is NULL 
를 작성해야하는 myCol 열에서 NULL이있는 모든 행을 반환하지 않습니다

select * from myTable where myCol <> 3 

이 쿼리를 작성할 수없는 이유

난에 궁금 해요

항상 IS NULL을 포함해야합니까? 또는 where 절 myCol <> 3이 내 Col 값에 null이있는 행을 반환하도록 설정할 수 있습니까

+13

그것은 NULL 작동 방식입니다. IS NULL과 IS NOT NULL을 제외하고는 비교가 이루어지지 않습니다. – kurosch

+0

@kurosch : 엄격하게 라인을 따라 가면, 비교이기 때문에 NULL = NULL도 false를 반환합니까? – Marcel

+2

@Marcel : 예, NULL = NULL은 항상 false이며, 그 문제에 너무 NULL이다 <> NULL :-) – kurosch

답변

14

나는 당신의 접근 방식은 좋은 생각 :

SELECT * 
FROM MyTable 
WHERE myCol <> 3 OR myCol IS NULL 

당신이 대안을 요구하고 있기 때문에, 그것을 할 수있는 또 다른 방법은 당신의 열 NOT NULL을하고 데이터베이스에 다른 (otherwised되지 않은) 값을 저장하는 대신 NULL하는 것입니다 - 예 : -1. 그러면 myCol <> 3이라는 표현은 다른 값과 마찬가지로 가짜 NULL과 일치합니다.

SELECT * 
FROM MyTable 
WHERE myCol <> 3 

그러나 일반적으로 나는이 방법을 사용 하지에게 추천 할 것입니다. 당신이 이미 그것을하는 방식은 올바른 방법입니다. 또한

는 여러 가지 다른 데이터베이스가 정확하게 당신이 원하는 않는 IS DISTINCT FROM을 지원하는 것을 언급 할 가치가있을 수도 있습니다 :

SELECT * 
FROM MyTable 
WHERE NOT myCol <=> 3 

:

SELECT * 
FROM MyTable 
WHERE myCol IS DISTINCT FROM 3 

MySQL은이 목적을 위해 사용할 수있는 NULL-safe equal있다 불행하게도 SQL Server는 이러한 구문 중 하나를 아직 지원하지 않습니다.

+0

MS 사이트에서 "DISTINCT PREDICATE"라는 ISO 기능을 upvote하십시오. https://connect.microsoft.com/SQLServer/feedback/details/286422/add-language-and-optimizer-support-for-iso-distinct-predicate – montewhizdoh

2

값을 테스트 할 때마다 모든 NULL이 생략됩니다. 결국 일부 열의 값이 특정 조건을 통과하고 NULL이 이 아니고이 아닌지 테스트하고 있습니다.

3

NULLevaluate to Unknown과 관련된 표현식 때문에 NULL을 처리해야합니다. 당신이 원하는 경우에, 당신은 대신 할 수있는 :

select * 
from MyTable 
where isnull(MyColumn, -1) <> 3 

하지만이 매직 넘버 (-1)를 포함하고, 틀림없이 적은 읽을 수 IS NULL 원래 테스트보다.

편집 : 및 SQLMenace가 가리키는 것처럼 SARGable이 아닙니다. 당신이 다른 어떤 NULL 비교할 수 없기 때문에

+3

스 SARGable하지 ... MyTable에 에서 – SQLMenace

+0

선택 * 곳 ISNULL (MyColumn, 3) = 3 – nothrow

+0

@ SQLMenace : 좋은 지적, 나쁘게도 수행 할 것입니다 - 제 제안은 권하지 않습니다. – RedFilter

0

, NULL은 NULL로도 동일하지

DECLARE @i INT 
DECLARE @i2 INT 

SELECT @i = NULL, @i2 = NULL 

IF @i = @i2 
PRINT 'equal' 
ELSE 
PRINT 'not equal' 
1

난 항상이 NULL을 포함 할 필요가 또는 내가 그렇게 where 절을 그것을 설정할 수 있습니까 myCol <> 3은 Col에 대해 Null 값을 가진 행을 반환합니까? 당신

항상, 항상 항상 is null을 포함해야합니다.

3은 Not/Applicable과 같지 않으므로 Unkown과 같지 않습니다.

관련 문제