MySQL—IF函数—类似三目运算符

  • 一、前言
  • 二、IF()函数


一、前言

做项目时遇到需求,需要将车辆保险表的保险到期状态给区分显示(正常,即将到期,已过期),但是车辆保险表中并没有这个状态字段,所以得根据车辆保险时间去进行动态筛选出状态信息。

二、IF()函数

MySQL中的IF()函数作用类似于Java中的三目运算符,个人感觉在实际开发中使用可以避免多余的查询;

  • 表达式:IF(expr,value1,value2)
  • 说明:根据expr得到的结果,true返回value1 ,false返回 value2;
  • 示例
SELECT
	t1.ciId,
	t1.coid,
	t1.carName,
	t1.carLossStartDate,
	t1.compulsoryEndDate,
	t1.businessStartDate,
	t1.businessEndDate,
	t1.carStatus,
	t1.companyname
FROM
	(
	SELECT
		t1.ciid,
		t1.coid,
		t2.carname,
		t1.carLossStartDate,
		t1.compulsoryEndDate,
		t1.businessStartDate,
		t1.businessEndDate,
		-- 这里使用if()函数进行了嵌套后达到需求效果,
		-- 保险时间 <当前时间 or保险时间 =null-已过期,
		-- 当前时间 <=保险时间 <=两个月后的当前时间-即将到期,
		-- 否则则是-正常状态;
		-- 简写: if(expr1,'1',if(expr2,'2','0'))
		-- 保险状态说明 0-正常 1-已过期 2-即将过期
		IF( ( t1.compulsoryEndDate < DATE_FORMAT( NOW( ), '%Y-%m-%d 00:00:00' ) ) or t1.compulsoryEndDate is null, '1', 
		IF(t1.compulsoryEndDate BETWEEN DATE_FORMAT(NOW(),'%Y-%m-%d 00:00:00') and DATE_FORMAT(DATE_ADD(NOW(),INTERVAL +2 MONTH),'%Y-%m-%d 00:00:00'),'2','0')) carStatus,
		t1.companyname
	FROM
		vehicles_carinsurance t1
		LEFT JOIN vehicles_car t2 ON t1.cid = t2.cid
	WHERE
		t2.is_delete = '0' 
	) t1
WHERE
	t1.ciid = '67067'
	and t1.carStatus = '2'
 	and t1.coid in ('16041')
ORDER BY
	t1.compulsoryEndDate
  • 这里使用if()函数进行了嵌套后达到需求效果:
    1. 保险时间<当前时间or保险时间=null-已过期,
    2. 当前时间<=保险时间<=两个月后的当前时间-即将到期,
    3. 否则则是-正常状态;
    4. 简写: if(expr1,‘1’,if(expr2,‘2’,‘0’))
    5. 保险状态说明 0-正常 1-已过期 2-即将过期
  • 结果: