在 MySQL SELECT 查询中使用 IF 语句

Posted

技术标签:

【中文标题】在 MySQL SELECT 查询中使用 IF 语句【英文标题】:Using an IF Statement in a MySQL SELECT query 【发布时间】:2012-01-16 16:35:15 【问题描述】:

我正在尝试在 mysql 选择查询中使用 IF 语句。

在第一个 IFAND 语句之后出现错误。

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;

为什么这不起作用?在 MySQL 查询中执行 IF 语句的正确方法是什么?

【问题讨论】:

我认为您不能在查询中使用该指令,在 WHERE 子句中。也许您可以改用 IF() 函数重写查询? dev.mysql.com/doc/refman/5.0/en/… 【参考方案1】:

您使用的 IF/THEN/ELSE 结构仅在存储过程和函数中有效。您的查询将需要重组,因为您不能像这样使用 IF() 函数来控制 WHERE 子句的流程。

可以在查询中使用的 IF() 函数主要用于查询的 SELECT 部分,用于根据某些条件选择不同的数据,而不是在查询的 WHERE 部分中使用:

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

【讨论】:

我没有使用 IF 选择列。我想根据条件构建查询。因为我使用 IF Else。 我明白,我只是在解释这不是 IF 函数的目的,您不能在查询中使用 IF/THEN/ELSE 逻辑。如果您想这样做,您可以使用您的逻辑创建一个存储函数,该函数返回一个您可以在 WHERE 子句中使用的值。 我们可以用 CASE 语句代替 IF 与 CASE 相同。它实际上是用作选择返回值的动态方式,而不是在 WHERE 子句中放置条件元素的方式。 如果有更多if条件怎么办?一列输出?就像与上述解决方案格式相同的 If-else 语句【参考方案2】:

如何在 MySQL“选择列表”中使用 IF 语句:

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

如何在 MySQL where 子句搜索条件列表中使用 IF 语句:

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

如何在MySQL“有子句搜索条件”中使用IF语句:

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

使用 IF 语句和选择列表中使用的列来做出决定:

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

SQL 查询中嵌入的 If 语句是一种不好的“代码气味”。在代码审查期间,糟糕的代码具有很高的“每分钟 WTF”。这是其中之一。如果我在制作中看到这个带有你的名字的产品,我会自动不喜欢你。

【讨论】:

【参考方案3】:

试试这个代码对我有用

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

【讨论】:

以上是关于在 MySQL SELECT 查询中使用 IF 语句的主要内容,如果未能解决你的问题,请参考以下文章

IF 语句中带有子查询的 MySQL SELECT 语句的语法

在 mySQL SELECT 语句中使用嵌套的 IF

如何选择带有外语的mysql查询?

MySQL - 学习笔记 - SELECT语句

mysql语句where条件中的是啥意思

MySQL基础语法之子链接查询和特殊查询(union 和 limit)