2012-04-10 2 views
3

Die folgende Abfrage gibt eine Ergebnismenge aller new_name aus der Tabelle namesWie schreibt man eine WHERE-Anweisung basierend auf dem Wert einer CASE-Anweisung?

SELECT 
    CASE 
     WHEN nickname = '' THEN fullname ELSE nickname END AS new_name,  
    FROM names 

ich von new_name mithilfe der folgenden Abfrage

SELECT 
    CASE 
     WHEN nickname = '' THEN fullname ELSE nickname END AS new_name,  
    FROM names 
    WHERE new_name LIKE '%Joh%' 

Allerdings erhalte ich die Fehler

suchen bin versucht

Unbekannte Spalte 'neuer_name' in 'where clause'

Gibt es eine Möglichkeit, diese Funktionalität ohne eine Unterabfrage zu funktionieren?

+0

Sie haben einen Tippfehler - das ; nach der Klausel von. Es dass es? –

+0

Hat sich mysql nicht vereinigt? –

+0

@SteveMallory - Guter Fang, aber ich denke nicht, dass das das Problem ist. Ich habe die Abfrage aus Gründen des Beispiels vereinfacht und dabei einen Tippfehler erstellt – user784637

Antwort

5

Wenn Sie die case in der where Klausel wiederholen, wird die Anweisung arbeiten:

SELECT 
CASE 
    WHEN nickname = '' THEN fullname ELSE nickname END AS new_name  
FROM names 
WHERE (CASE WHEN nickname = '' THEN fullname ELSE nickname END) LIKE '%Joh%' 

Es ist nicht schnell sein würde, weil es nicht Indizes verwenden würde, aber es sollte funktionieren.

Ein etwas besserer Ansatz wäre wie folgt:

SELECT 
CASE 
    WHEN nickname = '' THEN fullname ELSE nickname END AS new_name  
FROM names 
WHERE (nickname like '%Joh%') or (fullname LIKE '%Joh%') 

Dadurch werden die gleichen Ergebnisse liefern, aber es kann Indizes für nickname und fullname verwenden, wenn Sie sie definieren, EDIT und den zweiten Operanden ändern von LIKE nicht die führende % verwenden.

+0

Danke dasblinkenlight. Ich benutze dies in einer Autovervollständigung mit 0 Verzögerung zwischen einem Tastendruck und der Ausführung der Abfrage, so dass das Speed-Upgrade im zweiten Beispiel genau das war, was ich suchte! – user784637

+0

+1 für die Berücksichtigung der Leistung – cctan

+0

Das wird auch keine Indizes verwenden! 'LIKE' verwendet keinen Index, wenn der Wert mit'% 'beginnt, und auch wenn es möglich ist, kann er nur * one * index verwenden und das' OR' schließt die Verwendung eines Indexes aus – Bohemian

2
SELECT 
    CASE 
     WHEN nickname = '' THEN fullname ELSE nickname END AS new_name,  
    FROM names 
    WHERE 
     (CASE 
     WHEN nickname = '' THEN fullname ELSE nickname END) LIKE '%Joh%'; 

die Spaltennamen es mehr Sinn verwenden coalesce Funktion macht, mit der ganzen ersetzen case ... when ... then ... end

1

Für mich unter der Annahme, Spitzname ist entweder NULL oder bevölkerte ...

SELECT COALESCE(nickname,filename) 
FROM table 
WHERE COALESCE(nickname,filename) LIKE '%JOE%' 
Verwandte Themen