我在尝试找出以下问题的最佳解决方案时遇到了问题。
我有一个名为Purchase的表,它有一个State列,其中1是授权的,2是完成的(还有一些其他的值)。
我还有一个Retailer表,它有一个RetailerProcessType列,其中1是一步,2是两步。
我有以下查询:
CASE purc.State
WHEN 1 THEN '"AUTHORISED"'
WHEN 2 THEN '"AUTHORISED"'
WHEN 4 THEN '"AUTHORISED"'
ELSE '"DECLINED"'
END
AS Autorised_Decline_Status,
但我需要做的是:
WHEN STATE = 2 AND RetailerProcessType = 1 THEN '"AUTHORISED"'
WHEN STATE = 1 AND RetailerProcessType = 2 THEN '"PENDING"'
WHEN STATE = 2 AND RetailerProcessType = 2 THEN '"AUTHORISED"'
ELSE '"DECLINED"'
我能想到这样做的唯一方法是在查询周围有一个大量的IF
语句,一个用于一步零售商,另一个用于两个步骤,因为我的理解是{{1} }子句中不能包含WHEN
。
然而,这似乎只是漫长的啰嗦;任何人有任何更整洁的想法?
答案 0 :(得分:51)
你可以这样做:
-- Notice how STATE got moved inside the condition:
CASE WHEN STATE = 2 AND RetailerProcessType IN (1, 2) THEN '"AUTHORISED"'
WHEN STATE = 1 AND RetailerProcessType = 2 THEN '"PENDING"'
ELSE '"DECLINED"'
END
您可以在AND
进行CASE
的原因是您没有查看STATE
STATE
,而是检查了CASING条件。
此处的关键部分是WHEN
条件是{{1}}的一部分。
答案 1 :(得分:8)
只需稍微更改语法:
CASE WHEN STATE = 2 AND RetailerProcessType = 1 THEN '"AUTHORISED"'
WHEN STATE = 1 AND RetailerProcessType = 2 THEN '"PENDING"'
WHEN STATE = 2 AND RetailerProcessType = 2 THEN '"AUTHORISED"'
ELSE '"DECLINED"'
END
如果你没有在CASE
语句之前放置字段表达式,你可以在那里放置你想要的任何字段和比较。这是一种更灵活的方法,但语法稍微冗长。
答案 2 :(得分:-3)
SELECT Get_Log.IDNo, Get_Log.StudentName, Get_Log.[Sign-in Date], Get_Log.DurationOfSum, Get_Log.Day,
CASE WHEN DurationOfSum > 5 THEN '"present"'
ELSE '"absent"'
END AS Attendance
FROM Get_Log;