2017-05-08 60 views
4

我有一個表引用城市表與一個名爲cityId的鍵。 我取使用此查詢從它的數據:左連接過濾空值與自定義函數在哪裏

SELECT t.ID, city.areaId FROM transp t 
LEFT JOIN city ON city.ID = t.cityId; 

這樣,原樣返回表,與空的city.areaId如果cityId爲null。

但是,當我將函數添加到使用city.areaId的where子句時,即使函數始終爲true,查詢也不會顯示其中cityId爲空的行。例如:

SELECT t.ID, city.areaId FROM transp t 
LEFT JOIN city ON city.ID = t.cityId 
WHERE always_true(city.areaId); 

不會顯示任何空行cityId。我不明白爲什麼會發生這種情況,因爲我使用的是left join,如果我將該函數放入SELECT中,我可以看到它確實總是如此。

SQLFiddle

+2

看起來像MySQL的錯誤。它在'where'如'1 = 1'的表達式中表現正確。 –

+1

您能發送一個鏈接到正確的行爲在sqlfiddle中使用1 = 1嗎?我不能重複, – smartDonkey

+2

是的,這種行爲是非常奇怪的。我希望這兩個記錄都能顯示出來。把它作爲一個MySQL錯誤提出來,看看MySQL開發者提出的答案是值得的。 – Shadow

回答

4

好,雖然看起來很像MySQL的做了一些內部優化,我想說的是越野車(轉換左連接到內部在這種情況下是不正確的)有一種變通方法

SELECT t.ID, city.areaId 
FROM transp t 
LEFT JOIN city ON city.ID = t.cityId 
WHERE always_true(coalesce(city.areaId, null)); 
+1

謝謝!這*做*工作,但我不確定是否將該標記標記爲已接受的答案,因爲這不是真正的解決方法。 – smartDonkey

+2

你知道,如果我是你,我會將這個bug報告給MySQL bugtracker,因爲_real_修正應該在C代碼中 – Alexey

+2

更有趣的是,MySQL將UDF(always_true())與內置函數(coalesce() ) – Shadow