2017-12-27 2 views
1

답변을 찾을 수 없었던 SQL 문법에 대한 질문이 있습니다.하지만 잘못된 문구를 모두 검색 할 수도 있습니다.SQL Server : Nullable 비트, 필드 <> 'true'가 예상대로 작동하지 않는 이유는 무엇입니까?

"HasDroppedOut"필드 인 nullable bit 필드가있는 멤버가있는 테이블이 있습니다.

SELECT * FROM Members WHERE HasDroppedOut<>'true' 

또는이 같은 :

SELECT * FROM Members WHERE (HasDroppedOut IS NULL OR HasDroppedOut='false') 

내가 다른 결과를 얻을 수

나는 지금은이 같은 멤버를 선택하면 것을 찾을 수 있습니다. 이는 일부 행에 IsDroppedOut 열에 NULL 필드가 포함되어 있고 첫 번째 쿼리에서 제외되지만 두 번째 쿼리에는 포함되지 않기 때문입니다.

누군가가 이것이 왜 무엇인지 밝힐 수 있습니까? 여기서 어떤 부분을 파악하지 못합니까?

+0

제거 닫는 괄호과 영업 이익의 환경의 –

답변

1

'true'의 반대는 'false' OR NULL이 아닙니다. NULL 값은 값이 전혀 알려지지 않은 값을 개념적으로 나타냅니다. 즉, true 또는 false인지 여부는 알 수 없습니다. 따라서 NULLfalse 레코드를 함께 모으는 것은 바람직하지 않습니다.

더 의미있는 비교는 다음과 같은 두 가지 쿼리를 동일시하는 것입니다 :

SELECT * FROM Members WHERE HasDroppedOut <> 'true' 
SELECT * FROM Members WHERE HasDroppedOut = 'false' 

는 이러한 쿼리의 모두 NULL 기록을 포함하지 것이다, 그래서이 NULL 기록은 전혀 비교의 일부가 될 수 없다.

+0

을 확인, 대답은 잘 NULL'은 다음과 같이 분류 할 수있다'있다고 할 수있다 '거짓 '. 이것은 항상 사실이 아니지만 나는 좋은 본보기를 줄 수 있습니다. 우리 사무실에는 고객이 우리를 위해 마케팅을받을 수있는 옵트 인 (Opt-In)이 있습니다. 웹 사이트에서,이 값은 ticked (또는 unticked로 남겨져 야 함)이며, 결과는'bit' 칼럼에 1 또는 0 값이됩니다. 그러나 고객이 전화로 말하면 물어야합니다. 운영자가 묻지 않으면 화면 필드는 공백으로 남습니다 (예 또는 아니오 대신). 이 경우, 우리가 물어 보지 않았 듯이, 'NULL'은 (같은 값이 아니더라도) '0'으로 취급됩니다. – Larnu

+0

@Larnu 흥미 롭지 만, OP는 질문에 그런 맥락을주지 않았다. –

+0

나는 그들이 'NULL'과 '거짓'에 대한 귀하의 의견에 응답하여 코멘트를 작성하지 않았 음을 알고 있습니다. 그들이 할 수있는 시간은 분명히 있습니다. 가장 중요한 것은 데이터에 대한 지식이 있다는 것입니다. 어떤 환경에서는'NULL' 자체가 "알려진"값을 가질 수 있습니다.당신의 대답이 잘못되었다는 말은 전혀 아닙니다. 당신은 참으로 옳다.'NULL'과'<> 'true'는 동일하지 않다. 나는 OP의 사고 과정을 설명 할 수있는 추가 입력을 추가하는 중이고, 두 가지가 "동등한"것으로 간주 될 수있는 부분을 추가하는 것입니다. – Larnu

1

NULL과 비교하면 IS (NOT) NULL을 사용해야합니다. =, <> 또는 != 연산자를 NULL로 사용하면 UNKNOWN이 리턴됩니다.

고려 : NULL 반환에 비교가 NULL 때문에 값이 모두 'Eh?'을 반환

DECLARE @bit bit = NULL; 

SELECT CASE @Bit WHEN 0 THEN 'Yes' 
       WHEN 1 THEN 'No' 
       ELSE 'Eh?' 
     END AS StatedValue, 
     CASE WHEN @Bit <> 1 THEN 'Yes' 
      WHEN @Bit <> 0 THEN 'No' 
      ELSE 'Eh?' 
     END AS UnstatedValue; 

공지있다.

그래서,이 예를 들어, 당신이해야 할 것 : where 절에

DECLARE @bit bit = NULL; 

SELECT CASE WHEN @Bit <> 1 THEN 'Yes' 
      WHEN @Bit <> 0 THEN 'No' 
      WHEN @Bit IS NULL THEN 'Neither' 
      ELSE 'Eh?' 
     END AS CheckedValue; 
+0

OP의 질문은 'Column <>'True '와'Column IS NULL OR Column = 'False'가 다른 결과를 산출하는 이유입니다. 'Column <>'True '라는 표현이'NULL '인 곳에서 TRUE를 반환하지 않는 이유는'Column IS NULL OR Column = 'False'가 사용하는 것과 같습니다. – Larnu

+0

나는 너를 잡았다 ... 나는 그 점에서 생각하지 않았다 :-) –

관련 문제