web-dev-qa-db-fra.com

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

J'essaie d'utiliser une instruction IF dans une requête de sélection MySQL.

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?

24
Santosh

La construction IF/THEN/ELSE que vous utilisez n’est valable que dans les procédures et les 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 de la sorte.

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 différentes données en fonction de certaines conditions, mais pas tellement à utiliser 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 ...
44
davidethell

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 la 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 MySQL "conditions de recherche de clause":

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

tilisez une instruction IF avec une colonne utilisée dans la liste de sélection pour prendre une décision:

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

Si les instructions incorporées dans les requêtes SQL sont une mauvaise "odeur de code". Le code incorrect a un "WTF par minute" élevé lors de la révision du code. C'est l'une de ces choses. Si je vois ceci en production avec votre nom, je ne vous aimerai pas automatiquement.

16
Eric Leschinski

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
Ameen Maheen