今天做某个查询结果的测试时,由于查询结果中的状态有多种情况,故而想到用case when。。。else。。。end这样的sql来简化查询。但是使用过程中发现,这个语句中只允许有两种情况(符合条件一种;不符合条件为另一种),而我要的查询结果分3种情况。
在这里遇到了一点小麻烦,但是经过小小的实验,发现该语句可以嵌套使用,这样就方便了很多。以下是我的示例:
需求:获取所有报告当前的状态;
数据库表:
1,报表信息表:报告Id,报告人,报告时间,取消人,取消时间(其中取消人和取消时间在该报告没有被取消的情况下为空)
2,报告处理表:处理Id,报告Id,处理人,处理时间,处理状态(一个报告可能有多种处理状态)
所有报告的情况有:
1,新报告:没有被取消也没有开始处理的报告,用1表示其状态;
2,被取消的报告(注:处理过的报告不允许取消),用2表示其状态;
3,处理过的报告:取其实际的处理状态。
我最终使用的sql:
SELECT a.reportId,a.reporter,a.reportTime,
(CASE WHEN c.status IS NULL AND a.cancelPerson IS NULL THEN 1
ELSE (CASE WHEN a.cancelPerson IS NOT NULL THEN 2 ELSE c.status END) END) AS reportStatus,
fixPerson, fixTime
FROM
(SELECT reportId,reporter,reportTime,cancelPerson,cancelTime FROM t_report) AS a
LEFT JOIN
(SELECT reportId,MAX(fixId) AS fixId FROM t_fixReport GROUP BY reportId) AS b
ON a.reportId= b.reportId
LEFT JOIN
(SELECT fixId, STATUS, fixPerson, fixTime FROM t_fixReport ) AS c
ON b.fixId = c.fixId