2017-12-07 20 views
0

Ich habe eine Funktion mit CASE WHEN Bedingung in WHERE-Klausel. Einfach (sehr einfach) sieht es wie folgt aus:"CASE WHEN" in WHERE-Klausel mit indizierten Spalten

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 und aID - Funktion

params

ein, b und c - indizierte Spalten der Tabelle „mytable "

Aber in diesem Fall verwendet MySQL überhaupt keine Indizes.

Ja, diese Abfrage enthält die Bedingung zum Auswählen einer anderen Bedingung, aber sie hängt nicht vom Ergebniswert ab und kann vor der Ausführung der Abfrage berechnet (definiert) werden.

Was kann sugget für diese Funktion verwenden Indizes verwenden?

Antwort

1

Case ist ein Ausdruck, für den MySQL keine Indizes verwenden kann. Versuchen Sie, das Gehäuse in eine Reihe von or Bedingungen wie folgt umwandeln:

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

Perfekt !!! Ich habe diese Variante benutzt, aber die letzte Bedingung verpasst. Vielen Dank. – Vitaly