2013-01-07 2 views
3

테이블에 'N/A', 'Single', 'Multiple'의 3 개 값이있는 상태 열이 있습니다. 일부 행의 상태 열에는 NULL 값이 있습니다.SQL 서버 쿼리의 NULL 값

Status가 Null이 아니고 'N/A'가 아닌 행을 모두 가져와야합니다. 기본적으로 상태가 "Single"또는 "Multiple"인 모든 행이 필요합니다.

저는 'UNKNOWN'과 동등한 NULL에 대해 방금 읽었습니다. 내가

SELECT * 
FROM t_userstatus 
WHERE status <> 'N/A' 

을 말한다면

나는 결과 ("싱글"또는 "복수"를 만 들어있는 모든 행)을 얻는다.

제가 알고 싶습니다. 위의 WHERE 절은 항상 NULL 값을 갖는 행을 제외합니까? 예상되는 동작입니까?

명시 적으로 지정하지 않았지만 null 행을 제외시키는 이유는 무엇입니까?

제 질문에 명시 적으로 상태 IS NOT NULL을 말해야합니까?

저는 비교적 프로그래밍에 익숙하지 않으며, 어떤 도움을 주시면 감사하겠습니다.

답변

5

SQL은 three-valued logic : true, false 및 unknown을 사용합니다. null과 비교하면 unknown이됩니다.

따라서 null <> 'N/A'unknown으로 평가됩니다. unknown이 사실이 아니기 때문에 행이 제외된다는 의미입니다.

6

N/A (Single & Multiple뿐만 아니라이) NULL 관련되지 않은 문자열로 정상 동작하지 않습니다. NULL은 알 수 없음으로 평가되고 반환되지 않을 수도 있지만 이어야하며 IS NOT NULL을 명시 적으로 사용해야합니다.

SELECT [column_list] FROM t_userstatus 
WHERE status IS NOT NULL AND status <> 'N/A' 

또한 열 목록을 지정하는 습관을 가지기를 권장합니다.

+1

다음 사람의 명확성을 위해 is not null을 명시 적으로 사용해야한다는 것에 동의하지만 이는 기본 구성이 지정된 서버의 정상적인 동작입니다. 또한 정상적인 상황에서 열 목록을 지정하는 습관에 동의하지만 완전한 열 목록이 아닌 방법으로 *가 실제로 적합한 경우는 거의 없습니다. – TimothyAWiseman

2

예, 정상적인 동작입니다. A NULL 값은 값이 없으므로 WHERE 조건을 만족하지 않습니다. Null 값도 포함하려면 IS NOT NULL도 지정해야합니다.

2

분명히 비트가 아닌 SQL에는 3 가지 논리 (true/false/unknown)가 있습니다. NULL과 직접 비교하면 값이 WHERE 절에서 true가 아닌 것으로 간주됩니다. 너의 상태; NULL 아무것도에 "동일하지"적이 없기 때문에

WHERE status <> 'N/A' 

는 다른 말로 널과 일치하지 않습니다.

비교를 사용하여 NULL을 일치시키는 유일한 방법은 특수 널 작업 IS NULL 또는 IS NOT NULL을 사용하는 것입니다.보조 노트로

, 다른 사람들이 말했듯이 life is naturally never quite that simple.

+1

'null'과 비교하면'false'가 아닌'unknown'이 반환됩니다. – Andomar

+1

@Andomar 3 가지 논리의 관점에서 보면 의미가 있습니다. SQL Server의 내부 용 문서는 실제로 거짓임을 나타냅니다. http://msdn.microsoft.com/ko-kr/library/aa259229(v=sql.80).aspx 설명 아래 두 번째 단락을 참조하십시오. – TimothyAWiseman

+3

@TimothyAWiseman - 설명서가 잘못되었습니다. 아마도 SQL Server 2000의 경우처럼 아무도 수정할 필요가 없을 것입니다. [이 기사의 업데이트 된 버전] (http://msdn.microsoft.com/en-us/library/ms188048.aspx) 'false'로 평가되면'NOT (status <> 'N/A')'가 true가됩니다. 그렇지 않습니다. 또한'NULL <> 'N/A''를 가진 check 제약 조건은 어떠한 행도 삽입하지 못하게합니다. 그렇습니다. –

2

는 널 (null)은 일반적으로 비교할 수 없습니다. 그래서, status! = 'N/A'는 status가 null 일 때 거짓으로 되돌아옵니다.

하지만 다른 사람들이 아직 언급하지 않은 것은 Ansi_nulls 설정을 통해 제어된다는 것입니다. 기본적으로이 기능은 켜져 있으며 nulls는 비교할 수 없습니다 (질문에서 말한 것처럼, 뒤에있는 주체는 알 수 없으므로 반드시 N/A가 아니라는 것이 거짓입니다). 그러나 당신은 사용할 수 있습니다

SET ANSI_NULLS OFF 

이 동작을 변경하려면 null이 다른 것과 동일하지 않은 경우이 동작을 변경하십시오. MSDN here에 대한 자세한 내용이 있습니다.