2016-09-02 6 views
0

Ich habe eine gespeicherte Prozedur, die eine Tabelle nach dem Filtern von Zeilen basierend auf Eingaben zurückgeben muss. Zwei der Eingänge sind sort_column und sort_dir. Die Abfrage muss ORDER BY sort_column in der sort_dir-Richtung (ASC oder DESC) lauten.MySQL: Verwendung von CASE für ORDER BY-Klausel

Ich habe die folgenden Abfragen aber vergeblich versucht. Die folgenden Abfragen wurden vereinfacht, um nur die relevanten Klauseln zu enthalten. Die anderen Filter funktionieren ordnungsgemäß ohne Probleme.

  1. SELECT * FROM table ORDER BY sort_column sort_dir
  2. SELECT * FROM table ORDER BY CASE sort_column WHEN 'col1' THEN col1_name WHEN 'col2' THEN col2_name END CASE sort_dir WHEN 'asc' THEN ASC ELSE DESC END

  3. I verketteten die 2 Eingänge 1 im Format _ und versucht, dies:

    SELECT * FROM table ORDER BY CASE sort_input 
        WHEN 'col1_asc' THEN col1_name ASC 
        WHEN 'col1_desc' THEN col1_name DESC 
        WHEN 'col2_asc' THEN col2_name ASC 
        WHEN 'col2_desc' THEN col2_name DESC END 
    

ich Fehler # 1064 immer. Es ist in jedem der obigen Fälle anders, zeigt aber immer auf den 'CASE' Teil. Dies ist der Fehler für die oben genannte Optionsnummer

## 1064 - Sie haben einen Fehler in Ihrer SQL-Syntax; Sie in die Bedienungsanleitung zu Ihrer MySQL-Server-Version für die richtige Syntax entspricht in der Nähe zu verwenden 'wenn 'col1' DANN col1_name END CASE 'asc' WENN 'desc' THEN DESC ELSE' in Zeile 4

Das Problem doesn Es scheint nicht der Name der Spalte zu sein. Es ist die Sortierrichtung, die nicht funktioniert. Wenn ich jede der obigen Optionen ohne die ASC- und DESC-Teile versuche, gibt es kein Problem.

Mache ich hier etwas falsch? Gibt es einen besseren Weg, abgesehen von CASE?

MySQL Version: 5.6

+2

Bitte fügen Sie die Complate-Fehlermeldung, nicht nur ein Teil – Jens

+0

Was ist falsch mit einfach 'ORDER BY sort_column sort_dir'? Sie sollten keine CASE-Anweisung benötigen. Aber es würde die vollständige Fehlermeldung (der "nahe ...." Teil) benötigen, um dies zu beheben. – Thilo

+0

@Jens Ich habe die Frage bearbeitet, um die vollständige Fehlermeldung zu enthalten. Bitte schau es dir an. Vielen Dank. – javaGirl243

Antwort

3

Der beste Ansatz ist es, mehr cases:

ORDER BY (CASE WHEN sort_input = 'col1_asc' THEN col1_name END) ASC, 
     (CASE WHEN sort_input = 'col1_desc' THEN col1_name END) DESC, 
     (CASE WHEN sort_input = 'col2_asc' THEN col2_name END) ASC, 
     (CASE WHEN sort_input = 'col2_desc' THEN col2_name END) DESC, 

Dieses ausführliche scheinen mag. Denken Sie jedoch daran, dass CASE ein Ausdruck ist, der einen einzelnen Wert zurückgibt. Daher können Sie ASC und DESC nicht als Teil der THEN einschließen.

Auch wichtig ist das Problem der Datentypen. Der SQL-Compiler entscheidet über einen einzelnen Typ für CASE Ausdruck. Dies kann zu unerwarteten Problemen führen, wenn die Spalten unterschiedliche Typen aufweisen.

Die einfachste Lösung besteht darin, einfach mehrere CASE Ausdrücke zu verwenden.

+0

Danke, das funktioniert! Aber ich bin neugierig, wenn die restlichen 3 CASE-Anweisungen als falsch ausgewertet werden und nicht ausgeführt werden, würde die Abfrage nicht enden wie 'ORDER BY ASC, DESC, col2_name ASC, DESC'?(Das ist, wenn 'sort_input' ist" col2_asc ". – javaGirl243

+0

Auch, wie denkst du, ich kann eine Standardspalte hinzufügen, um zu sortieren? – javaGirl243

+0

@ javaGirl243.. Sie würden es als den endgültigen Schlüssel hinzufügen.' Order by (case .), (case...), ..., defaultcol. Auch die 'case' Ausdrücke geben' NULL' zurück, keinen Wert, also ist die Syntax in Ordnung. –