2016-06-28 12 views
5

Ich habe die folgende SQL query:SQL Query - CASE unerwartetes Token

SELECT w.id, w.name, m.subject, m.id 
FROM users AS w, i_c AS c, 
(SELECT _id, u_id, subject FROM i_m WHERE (_id, tmstmp) IN 
     (SELECT _id, max(tmstmp) FROM i_m GROUP BY _id)) m 
     WHERE (c.uid_1 = '2' OR c.uid_2 = '2') AND 
     CASE WHEN c.uid_1 = '2' THEN w.id = c.uid_2 
     WHEN c.uid_2 = '2' THEN w.id = c.uid_1 END 
     AND (c.id = m.id) ORDER BY m.tmstmp DESC 

Es funktioniert gut auf meinem ersten Server, sondern auf einem zweiten Server, gibt mir

Unexpected Token. (near "c" at position 280) 

bei einem ähnlichen Sah Probleme aber noch nicht gefundene Lösung. Scheint das Problem ist CASE.

Konnte mir jemand helfen? Jede Hilfe würde sehr geschätzt werden. Danke im Voraus.

Antwort

3

Sie CASE ist falsch, CASE ist ein Ausdruck, keine Aussage, Sie können nur einen Wert in der , keine Bedingung angeben.

ändern es dazu:

 w.id = CASE WHEN c.uid_1 = '2' THEN c.uid_2 
        WHEN c.uid_2 = '2' THEN c.uid_1 
       END 

Wie @Jarlh vorgeschlagen, können Sie OR s verwenden, die die Abfrage optimieren kann etwas besser:

WHERE ((c.uid_1 = '2' AND w.id = c.uid_2) OR 
     (c.uid_2 = '2' AND w.id = c.uid_1)) AND 
+2

den Fall Ersetzen mit OR-ed Bedingungen wäre noch besser. (Einfacher zu optimieren.) – jarlh

+2

Es "funktioniert", weil MySQL boolesche Ausdrücke tatsächlich 0 oder 1 zurückgibt. Das ist etwas, das ich in keinem anderen DBMS gesehen habe. (Ich wäre nicht überrascht, dass der zweite Server nicht MySQL ist, weil die Fehlermeldung nicht so aussieht.) –