2017-10-18 309 views
1

我試圖拉出兩個字段不匹配的所有行。我明白,空值本質上是「未知數」,因此已採取步驟將空值定義爲0。如下。將NULL與INT進行比較

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

有誰能告訴我爲什麼這不起作用嗎?即使我覺得我正確地將空值定義爲「0」並且ifnull(field1,0)仍然沒有結果。

回答

2

它不起作用,因爲這是NULL值在關係數據庫中的工作方式。幾乎所有的比較返回NULL,這被視爲假。

此外,您在SELECT中所做的操作對WHERE沒有影響。這些字段仍然來自原始表格。

更重要的是你可以做什麼。最簡單的方法是使用NULL -safe比較:

where not field1 <=> field2 
+0

我喜歡這個比較,第一次看到它是誠實 – mrateb

+0

謝謝 - 我今天早上發現這個解決方案,但它沒有工作。顯然我做錯了呢!這是一個很好的解決方案,並已理清我的理解!再次感謝。 –

+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