2011-12-09 27 views
20

Estoy tratando de usar una declaración IF en una consulta de selección de MySQL.Usando una instrucción IF en una consulta MySQL SELECT

Recibo un mensaje de error después de la declaración AND donde aparece la primera 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; 

¿Por qué esto no funciona y cuál es la forma correcta de hacer una instrucción IF en una consulta MySQL?

+1

no creo que se puede utilizar la cláusula de que las instrucciones en una consulta, en un 'WHERE'. ¿Tal vez puede volver a escribir la consulta utilizando la función ** 'IF()' **? http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_if –

+0

me puede dar una imagen clara – Santosh

Respuesta

41

La construcción IF/THEN/ELSE que está utilizando solo es válida en procedimientos y funciones almacenados. Su consulta tendrá que ser reestructurada porque no puede usar la función IF() para controlar el flujo de la cláusula WHERE de esta manera.

La función IF() que se puede usar en consultas está destinada principalmente a ser utilizada en la parte SELECT de la consulta para seleccionar datos diferentes según ciertas condiciones, no tanto para usar en la parte WHERE de la consulta :

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

iam no seleccionando las columnas con IF.Quiero enmarcar la consulta según las condiciones .for that iam using IF Else. – Santosh

+0

Entiendo eso, solo estoy explicando que eso no es lo que la función IF debe hacer y que no puede usar la lógica IF/THEN/ELSE en las consultas. Si desea hacer esto, puede crear una función almacenada con su lógica que devuelva un valor que puede usar en su cláusula WHERE. – davidethell

+0

podemos usar declaraciones CASE en lugar de IF – Santosh

14

Cómo utilizar una instrucción IF en el MySQL "lista de selección":

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 

Cómo utilizar una instrucción IF en el MySQL en la lista condición de búsqueda cláusula:

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 

Cómo utilizar una instrucción IF en el MySQL "tener condiciones de búsqueda de la cláusula":

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

Usar una instrucción IF con una columna utilizada en la lista de selección para tomar una decisión :

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

Si instrucciones incrustadas en las consultas SQL es un mal "smel código l ". El código incorrecto tiene un alto "WTF por minuto" durante la revisión del código. Esta es una de esas cosas. Si veo esto en producción con tu nombre, automáticamente no te agradaré.

7

tratar este código funcionó para mí

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 
Cuestiones relacionadas