2016-06-28 22 views
5

Ho la seguente SQL query:SQL Query - CAUSA imprevisto 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 

Funziona bene sul mio primo server, ma, su un secondo server, mi dà

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

Guardato alcuni simili problemi ma non ancora trovato soluzione. Sembra che il problema sia CASE.

Qualcuno potrebbe aiutarmi? Qualsiasi aiuto sarebbe molto apprezzato. Grazie in anticipo.

risposta

3

CASE è errato, CASE è un'espressione, non un'istruzione, è possibile specificare un valore solo nello THEN, non in una condizione.

Change a questo:

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

Come @Jarlh suggerito, è possibile utilizzare OR s che possono ottimizzare la query un po 'meglio:

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

Sostituire il caso con condizioni OR-ed sarebbe anche meglio. (Più facile da ottimizzare.) – jarlh

+2

"funziona" perché MySQL fa in modo che le espressioni booleane restituiscano 0 o 1. Questo è qualcosa che non ho visto in nessun altro DBMS. (Non sarei sorpreso che il secondo server non sia in realtà MySQL, perché il messaggio di errore non sembra.) –

Problemi correlati