2017-10-18 1 views
1

두 필드가 일치하지 않는 모든 행을 가져 오려고합니다. nulls는 본질적으로 "unknowns"이므로 nulls를 0으로 정의하는 단계를 밟았 음을 이해합니다. 아래.NULL과 INT와의 비교

Select ifnull(field1, 0), ifnull(field2, 0) 
from table 
where field1 != field2 

아무도 왜 이것이 작동하지 않는지 말할 수 있습니까? 나는 여전히 ifnull (field1, 0)을 사용하여 "0"으로 null을 정의한다고 느낄지라도 결과가 없습니다.

답변

2

NULL 값이 관계형 데이터베이스에서 작동하는 방식이므로 작동하지 않습니다. 거의 모든 비교는 NULL을 반환하며 false로 처리됩니다.

또한 SELECT에서 수행하는 작업은 WHERE에 영향을 미치지 않습니다. 필드는 여전히 원본 테이블에서옵니다.

더 중요한 것은 할 수있는 일입니다. 가장 간단한 방법은 NULL - 안전 비교를 사용하는 것입니다

where not field1 <=> field2 
+0

나는이 비교가 마음에 든다. 정직한 – mrateb

+0

감사합니다 - 나는이 해결책을 오늘 아침에 발견했다. 그러나 그것은 일을 didnt한다. 분명히 나도 그때 뭔가 잘못 했어! 이것은 훌륭한 해결책이며 내 이해를 정리했습니다! 다시 한번 감사드립니다. –

+1

@mrateb. . . ANSI 표준 연산자는'IS DISTINCT FROM'입니다. –

0

때문에 0 다음에 삽입하고하지 당신이

대신 할 수 있어야 선택하기 전에 :

Select * from 
((Select *,ifnull(field1, 0) new_field1, ifnull(field2, 0) new_field2 
from table) As query) 
WHERE new_field1 != new_field2; 
0

당신은합니다 (IFNULL를 이동해야) 아래의 WHERE 절은 다음과 같습니다.

Select ifnull(field1,0) as 'Field1', ifnull(field2, 0) as 'Field2' 
from table 
where ifnull(field1,0) != ifnull(field2,0) 
+0

ifnull()을 선택하면 결과가 "다시 작성"됩니다. - WHERE 절로 이어지지 않습니다. - 그래서 대신 WHERE 절에서 사용해야합니다. 나는 그것을 SELECT와 WHERE 절에서 모두 비교해 보았습니다. 이제 실제로 비교되는 것을 볼 수 있습니다. :-) – MadsBinger

관련 문제