2012-01-19 51 views
18

我有设法解决以下问题最巧妙的解决了问题。SQL - case语句 - 当语句,并声明

我有有一个状态栏,其中1被授权,完成2和他们有一些人太表购买。

我也有一个零售商表,其中有一个柱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, 

我需要做的是如下:

时注明= 2,RetailerProcessType = 1,则 ' “授权”'

当状态= 1并且RetailerProcessType = 2那么''PENDING''

当状态= 2 AND RetailerProcessType = 2那么''授权''

ELSE“‘谢绝’”

我可以看到这样做的唯一方法是有一个巨大的IF周围的查询语句,一个是单步零售商,另一个用于两步为我的理解是WHEN子句不能在其中包含“AND”。

不过,这似乎只是丑陋和长篇大论,任何人有任何整洁的想法?

史蒂芬

回答

36

你可以这样来做:

-- 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 

你可以做一个,这里的原因是,你不检查状态的情况下,而是你是套管条件。

这里的关键部分是STATE条件是WHEN的一部分。

7

就永远改变你的语法非常轻微:

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语句之前把现场的表情,你可以把几乎任何领域和比较在那里,你要。这是一种更灵活的方法,但具有稍微冗长的语法。

-1
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;