2011-02-18 2 views
7

하나의 항등 연산자로 0과 NULL을 테스트하는 방법이 있습니까?sql 부울 진리 테스트 : 0 OR null

는 내가이 작업을 수행 할 수있는 실현이 작동 할 경우

WHERE field = 0 OR field IS NULL

하지만 내 인생은 백 번 쉬울 것 :

WHERE field IN (0, NULL)

을 (BTW, 왜하지 않습니다 그 작동합니까?)

나는 (COALESCE와 함께) SELECT 문에서 NULL을 0으로 변환하는 방법에 대해서도 읽었습니다. 내가 사용하고있는 프레임 워크는이 점을 불쾌하게 만들 것입니다.

이것을 실현하는 것은 이상한 일이지만, WHERE 조건을 사용하여 0과 NULL을 테스트 할 수있는 방법이 있습니까?

+0

은 "왜하지 않습니다 그 일 '부분 :'필드 = 0 또는 필드 = NULL' 지난 경우'unknown' 어디에서 필드 (0, NULL)이''입니다 –

+1

당신이 만약 IN 절을 확장하면, 왜 작동하지 않는지 명확하게 알 수 있습니다 :'field IN (0, NULL)'은'field = 0 OR field = NULL'과 동일하고 "="연산자를 사용하여 테스트 할 수 없습니다 NULL의 경우 결과를 알 수 없습니다. –

+0

그 반대의 경우, 필드 <> 0이 작동합니다. 그러나 null 결과에 대한 연산이 여전히 널 (null) 인 경우이를 무효화 할 수 없습니다. –

답변

6

field = 0 Or field Is Null과 대조적으로 field In(0,Null)field = 0 Or field = Null과 같기 때문에 작동하지 않습니다. 그것은 당신의 의도는 명확 만들면서 원래 field = 0 OR field Is Null 고수하는

Case 
When field = 0 Then 1 
When field Is Null Then 1 
End = 1 

더 나은 옵션은 다음과 같습니다 하나의 옵션은 CASE 표현식을 사용하는 것입니다.

+0

+1 또한 sargable입니다. –

0

귀하의 WHERE 성명은 IMO가 더 좋지만, WHERE !IFNULL(field, 0)을 시도해보십시오.

8

내가 편리한 IFNULL 기능을 사용하여 해당 비교를 작성합니다 수익률

"SQL 표준을 준수하기 위해 :

IFNULL(field, 0) = 0 

그리고 IN 기능에 대한 질문에 응답

NULL은 왼쪽이 인 경우뿐만 아니라 에 일치하는 항목이없는 경우에도 의 목록 중 하나와 일치합니다. ist는 NULL입니다. " - 응답 the docs