2017-12-07 13 views
0

WHERE節にCASE WHEN条件付きの関数があります。 - 関数がWHERE句のインデックス付き列での "CASE WHEN"

BとCをparamsは - テーブル「mytableはのインデックスを付けた列

SELECT * 
FROM mytable t 
WHERE (
    CASE aPARAM WHEN 'a' THEN t.a = aID 
       WHEN 'b' THEN t.b = aID 
       WHEN 'c' THEN t.c = aID 
       ELSE TRUE END 
) 

aPARAM援助:単純に(非常に簡単)、それはこのようになります"

しかし、この場合、MySQLはインデックスをまったく使用しません。

はい、このクエリには別の条件を選択するための条件が含まれていますが、結果の値に依存せず、クエリの実行前に計算(定義)できます。

インデックスを使用するためにこの関数に示唆できるものは何ですか?

答えて

1

ケースは、MySQLがインデックスを使用できない式です。ケースをorのような条件に変換してみてください。

SELECT * 
FROM mytable t 
WHERE (t.a = aID and aPARAM = 'a') 
or (t.b = aID and aPARAM = 'b') 
or (t.c = aID and aPARAM = 'c') 
or (aPARAM not in ('a','b','c')) 
+0

完璧!私はこの変種を使用しましたが、最後の状態を逃しました。ありがとう。 – Vitaly