2017-05-08 14 views
4

cityIdというキーを持つテーブルを参照するテーブルがあります。 私はこのクエリを使用して、そこからデータをフェッチ:、このようカスタム関数を使用してヌル値をフィルタリングして左結合します。

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

cityIdがnullだった場合、それはcity.areaIdためのNULLで、そのままテーブルを返します。

city.areaIdを使用しているwhere句に関数を追加すると、常にtrueの関数であっても、クエリではcityIdがnullの行は表示されません。たとえば、

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

nullのある行は表示されませんcityId。私はleft joinを使用しているので、なぜこのようなことが起こるのか分かりません。SELECTに関数を入れると、実際には常に真であることがわかります。

SQLFiddle

+2

がどのように見えるの回避策があるにしてもMySQLのバグ。 '1 = 1'のような' where'の式で正しく動作します。 –

+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

あなたが知っていれば、私はこのバグをMySQL bugtrackerに報告します。これは_real_修正がCコードにあるべきだからです。 – Alexey

+2

MySQLは組み込み関数(coalesce())をUDF(always_true ) – Shadow

関連する問題