SQL - CASE STATEMENT - WHEN语句AND语句

时间:2012-01-19 15:15:08

标签: tsql case case-when

我在尝试找出以下问题的最佳解决方案时遇到了问题。

我有一个名为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

然而,这似乎只是漫长的啰嗦;任何人有任何更整洁的想法?

3 个答案:

答案 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;