Utilisation D'une instruction IF dans une requête MySQL SELECT

J'essaie d'utiliser une instruction IF dans une requête MySQL select.

Je reçois une erreur après l'instruction AND où le premier 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;

Pourquoi cela ne fonctionne-t-il pas et quelle est la bonne façon de faire une instruction IF dans une requête MySQL?

22
demandé sur Eric Leschinski 2011-12-09 15:06:32

3 réponses

La construction IF/THEN/ELSE que vous utilisez n'est valide que dans les procédures et fonctions stockées. Votre requête devra être restructurée car vous ne pouvez pas utiliser la fonction IF() pour contrôler le flux de la clause WHERE comme ceci.

La fonction IF() qui peut être utilisée dans les requêtes est principalement destinée à être utilisée dans la partie SELECT de la requête pour sélectionner des données différentes en fonction de certaines conditions, pas tellement pour être utilisée dans la partie WHERE de la requête:

SELECT IF(JQ.COURSE_ID=0, 'Some Result If True', 'Some Result If False'), OTHER_COLUMNS
FROM ...
WHERE ...
42
répondu davidethell 2011-12-09 12:04:03

Comment utiliser une instruction IF dans la "liste de sélection "MySQL":

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

Comment utiliser une instruction IF dans la liste des conditions de recherche de clause MySQL where:

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

Comment utiliser une instruction IF dans les conditions de recherche de clause MySQL "having":

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

Utiliser une instruction if avec une colonne utilisée dans la liste de sélection de prendre une décision:

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

Si les instructions intégrées dans les requêtes SQL sont une mauvaise "odeur de code". Mauvais code a haute " WTF par minute " pendant la révision du code. C'est une de ces choses. Si je vois cela en production avec votre nom dessus, je vais automatiquement ne pas vous aimer.

16
répondu Eric Leschinski 2015-01-29 03:16:07

Essayez ce code a fonctionné pour moi

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
8
répondu Ameen Maheen 2017-06-11 19:47:48