我試圖拉出兩個字段不匹配的所有行。我明白,空值本質上是「未知數」,因此已採取步驟將空值定義爲0。如下。將NULL與INT進行比較
Select ifnull(field1, 0), ifnull(field2, 0)
from table
where field1 != field2
有誰能告訴我爲什麼這不起作用嗎?即使我覺得我正確地將空值定義爲「0」並且ifnull(field1,0)仍然沒有結果。
我試圖拉出兩個字段不匹配的所有行。我明白,空值本質上是「未知數」,因此已採取步驟將空值定義爲0。如下。將NULL與INT進行比較
Select ifnull(field1, 0), ifnull(field2, 0)
from table
where field1 != field2
有誰能告訴我爲什麼這不起作用嗎?即使我覺得我正確地將空值定義爲「0」並且ifnull(field1,0)仍然沒有結果。
它不起作用,因爲這是NULL
值在關係數據庫中的工作方式。幾乎所有的比較返回NULL
,這被視爲假。
此外,您在SELECT
中所做的操作對WHERE
沒有影響。這些字段仍然來自原始表格。
更重要的是你可以做什麼。最簡單的方法是使用NULL
-safe比較:
where not field1 <=> field2
因爲0插入之後,而不是你選擇
應改用前:
Select * from
((Select *,ifnull(field1, 0) new_field1, ifnull(field2, 0) new_field2
from table) As query)
WHERE new_field1 != new_field2;
你應該移動IFNULL( )下降到這樣的WHERE子句:
Select ifnull(field1,0) as 'Field1', ifnull(field2, 0) as 'Field2'
from table
where ifnull(field1,0) != ifnull(field2,0)
當選擇ifnull()時,你只用它「重寫」結果。 - 它不會持續到WHERE子句中。 - 這就是爲什麼你應該在WHERE子句中做到這一點。我已經在SELECT和WHERE子句中完成了它,因爲您現在可以看到它真正的比較。 :-) – MadsBinger
我喜歡這個比較,第一次看到它是誠實 – mrateb
謝謝 - 我今天早上發現這個解決方案,但它沒有工作。顯然我做錯了呢!這是一個很好的解決方案,並已理清我的理解!再次感謝。 –
@mrateb。 。 。 ANSI標準運算符將是'IS DISTINCT FROM'。 –