今天做项目写的一个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语句支持多重嵌套