2012-04-07 2 views
1

안녕 전문가를 필터링하는동작은 null 값을

enter image description here

내가 어떤 메시지를 보는 것을 사용자가 결정하는 또 다른 테이블이 :

enter image description here

는 지금이 만료 didinot 메시지. (예를 들어이 BeginYear 및 EndYear 등등 ... 사이 올해의)이 경우 사용자가 보지 않은 메시지를 표시하도록 쿼리를 작성해야한다. 나는이 쿼리의 총수 :

SELECT * 
FROM 
tblAlarms LEFT OUTER JOIN tblUsersAlarms tua ON tblAlarms.Id=tua.MessageID 
WHERE @CurrentYear BETWEEN tblAlarms.BeginYear AND tblAlarms.EndYear 
    AND @CurrentMonth BETWEEN tblAlarms.BeginMonth AND tblAlarms.EndMonth 
    AND @CurrentDay BETWEEN tblAlarms.BeginDay AND tblAlarms.EndDay 
    AND @CurrentHour * 60 + @CurrentMinute BETWEEN tblAlarms.BeginHour*60 + tblAlarms.BeginMinute AND tblAlarms.EndHour*60 + tblAlarms.EndMinute 
    --AND (tua.UserID <> 128 AND tua.UserID IS NULL) 

을 그리고 반환

enter image description here

을하지만 마지막 행의 주석을 해제하면 내가 사용자가 볼되지 않은 그 어떤 메시지를 확인할 수있는 record.How을 반환하지 않습니다 ?

감사합니다.

답변

6

NULL과 값을 비교 한 결과가 UNKNOWN입니다. 필터 조건은 조건이 TRUE로 평가되는 행만 선택하므로 조건이 FALSE 또는 UNKNOWN으로 평가되는 행은 선택되지 않습니다.

테스트 IS NULLIS NOT NULL 테스트는 다르며 항상 참 또는 거짓 대답을 생성합니다. 또한 column = NULL 또는 column != NULL을 작성할 수 없습니다 (적어도 SQL 표준은이를 허용하지 않으며 일부 SQL 언어는 허용 할 수 있습니다).

귀하의 조건은 다음과 같습니다 tua.UserID의 값이 NULL 인 경우

AND (tua.UserID <> 128 AND tua.UserID IS NULL) 
  • 는 다음 두 번째 임기가 TRUE로 평가하지만 첫 번째 뜻은 다음 UNKNOWN, 및 UNKNOWN으로 평가하고 TRUE를 알 수없는, TRUE가 아니므로 행이 선택되지 않습니다.

  • tua.UserID 값이 NULL이 아닌 경우 두 번째 용어는 FALSE로 평가되므로 전체 조건은 FALSE로 평가되므로 행이 선택되지 않습니다.

따라서 조건을 추가하면 관찰 된대로 아무 것도 선택되지 않습니다.

더 일반적으로, 당신의 상태는이 두 가지 중 하나 일 것입니다 :

AND (tua.UserID <> 128 AND tua.UserID IS NOT NULL) 

AND (tua.UserID <> 128 OR tua.UserID IS NULL) 

첫 번째 대안의 두 조건은 중복 사실이다. tua.UserID이 NULL이면 첫 번째 항목은 UNKNOWN으로 평가되므로 전체 조건은 TRUE가 아니며 행이 선택되지 않습니다. 두 번째 대안은 매우 유용합니다.

+0

고마워요.하지만 두 가지 마지막 조건이 내 조건을 만족시키지 못합니다. – Arian

+3

당신의 질문에 대한 대답이 아니라 설명입니다. 네가하고 싶은 일이 분명하지 않다. 오늘 물고기를주지 않고 물고기를 피우는 법을 배우도록 돕고 있습니다. –

0

"NULL"은 "값을 알지 못합니다"를 의미합니다. 그것은 "어떤 가치도있을 수 없다"는 의미는 아닙니다. 따라서 NULL 값을 인수로 사용하여 비교를 실행하면 실제 값 (알 수없는 값)에 따라 결과는 TRUE 또는 FALSE이 될 수 있습니다. 그러나 UNKNOWN은 유효한 비교 결과가 아니므로이 경우 출력은 FALSE입니다.

=처럼을 비교 한 연산자 넣어

, !=, <, <=, >, >=, 두 값 (필드 또는 리터럴) 사이 <>, 이러한 값 중 하나가 그 비교 동작의 결과가 NULL 인 항상FALSE

이미 사용 된 NULL 값에 대한 두 가지 특별한 비교 연산자가 있습니다 (IS NULLIS NOT NULL). 둘 다 이항 연산자가 아니라 단항 연산자입니다. 즉, 그들은 두 가지 주장을 가지고 있지 않다는 것을 의미합니다. 인수가 NULL 값인지 테스트합니다.

따라서 tua.UserIDNULL 일 경우 tua.UserID <> 128FALSE이어야합니다. 다른 부분 tua.UserID IS NULLTRUE이지만 FALSE AND TRUEFALSE이고 전체 행의 경우 WHERE-Condition FALSE이됩니다.

+0

-1 null은 값이 아니며 "누락 된 값의 마커"SQL은 값이 누락 된 이유를 알지 못합니다 - 의미는 [응용 프로그램 설계자의] 작업 "이므로"가능합니다 원한다면 '어떤 가치도 없다'. SQL에서 'UNKNOWN'은 참으로 유효한 비교 결과입니다. null과 관련된 연산자를 사용한 비교가 항상 FALSE를 평가하는 것은 아닙니다. – onedaywhen