mysql中复杂sql语句之多重if嵌套语句

今天做项目写的一个sql:

SELECT
	(
		SELECT

		IF (
			NOW() < cs.start_date,
			'has_not_started',

		IF (
			NOW() > cs.end_date,
			'end',

		IF (
			NOW() > cs.start_date
			AND NOW() < cs.end_date,
			'processing',
			0
		)
		)
		) AS contract_status
	) AS contract_status,
	cs.number,
	cc.`name`,
	cs.way,
	cs.start_date,
	cs.end_date,
	cs.`status`,
	cs.bind_start_date,
	cs.bind_end_date,
	cs.bind_status,
	cs.signed_date,
	cs.signed_power,
	cs.last_signed_power,
	cs.document_id,
	cs.guarantee,
	cs.party_a,
	cs.party_b,
	(
		SELECT
			u.fullname
		FROM
			USER u
		WHERE
			cs.user_id = u.id
		ORDER BY
			u.id
	) AS used_contact_name,
	(
		SELECT
			u.mobile
		FROM
			USER u
		WHERE
			cs.user_id = u.id
		ORDER BY
			u.id
	) AS used_contact_mobile,
	cs.max_load,
	(
		SELECT
			u.fullname
		FROM
			USER u
		WHERE
			cc.user_id = u.id
		AND u.enabled = 1
		AND u.type = 1
		AND u.`status` = 1
		ORDER BY
			u.id
	) AS user_name,
	cs.confirmor,
	cs.confirm_time,
	cs.bangder,
	cs.binding_time
FROM
	contract_sale cs
LEFT JOIN customer_companies cc ON cs.company_id = cc.companies_id
AND cs.customer_id = cc.customer_id
WHERE
	cs.company_id = 12
AND (
	SELECT
		u.fullname
	FROM
		USER u
	WHERE
		cc.user_id = u.id
	AND u.enabled = 1
	AND u.type = 1
	AND u.`status` = 1
	ORDER BY
		u.id
) LIKE '%高%'
ORDER BY
	cs.id DESC
LIMIT 0,
 2

难在哪呢?

看看表结构:

表中没有contract_status这个字段,需要根据合同开始时间(start_time)和合同开始时间(end_time)来设置:

1. 当现在时间小于开始时间,合同未开始设置contract_status为has_not_started

2.当现在时间大于结束时间,合同已经结束设置contract_status为over

3.当现在时间大于开始时间小于结束时间,合同进行中设置contract_status为processing

具体实现:

MySQL的IF既可以作为表达式用,也可在存储过程中作为流程控制语句使用,如下是做为表达式使用:

IF表达式

IF(expr1,expr2,expr3)

如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为expr2; 否则返回值则为 expr3。IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定。

SELECT IF(sva=1,"男","女") AS s FROM table_name 
WHERE sva != '';

如果是两重IF判断的时候:

IF(expr1,expr2,IF(expr1,expr2,expr3))

如果是三重时候可以:

IF(expr1,expr2,IF(expr1,expr2,IF(expr1,expr2,expr3)))

(
		SELECT

		IF (
			NOW() < cs.start_date,
			'has_not_started',

		IF (
			NOW() > cs.end_date,
			'end',

		IF (
			NOW() > cs.start_date
			AND NOW() < cs.end_date,
			'processing',
			0
		)
		)
		) AS contract_status
	) AS contract_status,

总结:sql中的if语句支持多重嵌套

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值