如何改进使用两列的case语句

问题描述 投票:27回答:3

我有一个名为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声明,一个用于一步零售商,另一个用于两步,因为我的理解是WHEN子句不能有AND

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

tsql case case-when
3个回答
53
投票

你可以这样做:

-- 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的原因是你没有检查CASESTATE,而是你是CASING条件。

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


9
投票

只需稍微改变您的语法:

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语句之前放置字段表达式,你可以在那里放置你想要的任何字段和比较。这是一种更灵活的方法,但语法稍微冗长一些。

© www.soinside.com 2019 - 2024. All rights reserved.