2011-12-09 20 views
20

Sto tentando di utilizzare un'istruzione IF in una query di selezione MySQL.Utilizzo di un'istruzione IF in una query SELECT MySQL

Viene visualizzato un errore dopo la dichiarazione AND in cui il primo IF.

SELECT J.JOB_ID,E.COMPANY_NAME,J.JOB_DESC,JT.JOBTYPE_NAME,J.COMPENSATION,ST.STATE_NAME,MC.METRO_CITY_NAME,I.INDUSTRY_NAME, 
J.JOB_CONTACT_PERSON,J.DT_INSRT,J.JOB_TITLE,J.JOB_EXP_DATE,J.SKILLS 
FROM JOBS J 
JOIN EMPLOYER E ON J.COMPANY_ID=E.COMPANY_ID 
JOIN LOOKUP_JOBTYPE JT ON J.JOB_TYPE=JT.JOBTYPE_ID 
JOIN LOOKUP_STATE ST ON J.STATE_ID=ST.STATE_ID 
JOIN JOBS_LOCATION JL ON J.JOB_ID=JL.JOB_ID 
JOIN LOOKUP_METRO_CITY MC ON JL.METRO_CITY_ID=MC.METRO_CITY_ID 
JOIN LOOKUP_INDUSTRY I ON J.INDUSTRY_ID=I.INDUSTRY_ID 
JOIN JOBS_QUALIFICATION JQ ON J.JOB_ID=JQ.JOB_ID 
JOIN LOOKUP_DEGREE_QUALIFICATION LDQ ON LDQ.QUALIFICATION_ID = JQ.QUALIFICATION_ID 
WHERE J.ACTIVE='Y' AND J.DT_INSRT > COALESCE(pEmailSntDt,DATE_SUB(SYSDATE(),INTERVAL 4 DAY)) 
AND 
IF(JQ.COURSE_ID=0) 
THEN 
IF(JQ.DEGREE_ID=0) 
THEN J.SKILLS LIKE CONCAT('%', pSkills,'%') 
ELSE 
JQ.DEGREE_ID=pDegreeId OR J.SKILLS LIKE CONCAT('%', pSkills,'%') 
END IF 
ELSE 
JQ.COURSE_ID=pCourseId OR IF(JQ.DEGREE_ID=0) 
         THEN 
         J.SKILLS LIKE CONCAT('%', pSkills,'%') 
         ELSE 
         JQ.DEGREE_ID=pDegreeId OR J.SKILLS LIKE CONCAT('%', pSkills,'%') 
         END IF 
END IF       
GROUP BY J.JOB_ID ORDER BY J.DT_INSRT DESC; 

Perché questo non funziona e quale è il modo corretto di eseguire un'istruzione IF in una query MySQL?

+1

non credo che è possibile utilizzare che le istruzioni in una query, in un 'WHERE' clausola. Forse puoi riscrivere la query usando la funzione ** IF() '**? http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_if –

+0

puoi darmi un'immagine chiara – Santosh

risposta

41

Il costrutto IF/THEN/ELSE che si sta utilizzando è valido solo in stored procedure e funzioni. La tua query dovrà essere ristrutturata perché non puoi utilizzare la funzione IF() per controllare il flusso della clausola WHERE come questa.

funzione

L'IF() che può essere utilizzato nelle query è pensato principalmente per essere utilizzato nella parte SELECT della query per la selezione dei dati diversi in base a determinate condizioni, non tanto per essere utilizzato in WHERE parte della query :

SELECT IF(JQ.COURSE_ID=0, 'Some Result If True', 'Some Result If False'), OTHER_COLUMNS 
FROM ... 
WHERE ... 
+0

iam non selezionando le colonne usando IF.Voglio inquadrare la query in base alle condizioni .per che iam usa IF Else. – Santosh

+0

Capisco che, sto solo spiegando che non è ciò che la funzione IF è destinata a fare e che non è possibile utilizzare la logica IF/THEN/ELSE nelle query. Se si desidera eseguire questa operazione, è possibile creare una funzione memorizzata con la logica che restituisce un valore che è possibile utilizzare nella clausola WHERE. – davidethell

+0

possiamo usare le istruzioni CASE invece di IF – Santosh

14

Come utilizzare un'istruzione IF in MySQL "elenco di selezione":

select if (1>2, 2, 3);       //returns 3 
select if(1<2,'yes','no');      //returns yes 
SELECT IF(STRCMP('test','test1'),'no','yes'); //returns no 

Come utilizzare un'istruzione IF in MySQL in cui lista di ricerca clausola di condizione:

create table penguins (id int primary key auto_increment, name varchar(100)) 
insert into penguins (name) values ('rico') 
insert into penguins (name) values ('kowalski') 
insert into penguins (name) values ('skipper') 

select * from penguins where 3 = id 
-->3 skipper 

select * from penguins where (if (true, 2, 3)) = id 
-->2 kowalski 

Come utilizzare un'istruzione IF in MySQL "avere condizioni di ricerca clausola":

select * from penguins 
where 1=1 
having (if (true, 2, 3)) = id 
-->1 rico 

utilizzare un'istruzione IF con una colonna utilizzata nella lista di selezione per prendere una decisione :

select (if (id = 2, -1, 1)) item 
from penguins 
where 1=1 
--> 1 
--> -1 
--> 1 

Se istruzioni incorporate nelle query SQL è un cattivo "codice SMEL l". Il codice errato ha un elevato "WTF al minuto" durante la revisione del codice. Questa è una di quelle cose. Se vedo questo in produzione con il tuo nome sopra, automaticamente non mi piacerà.

7

provare questo codice ha funzionato per me

SELECT user_display_image AS user_image, 
     user_display_name AS user_name, 
     invitee_phone, 
     (CASE WHEN invitee_status = 1 THEN "attending" 
      WHEN invitee_status = 2 THEN "unsure" 
      WHEN invitee_status = 3 THEN "declined" 
      WHEN invitee_status = 0 THEN "notreviwed" 
     END) AS invitee_status 
    FROM your_table