我有一个名为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
。
然而,这似乎只是漫长的啰嗦;有谁有更整洁的想法?
你可以这样做:
-- 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
,而是你是CASING条件。
这里的关键部分是STATE
条件是WHEN
的一部分。
只需稍微改变您的语法:
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
语句之前放置字段表达式,你可以在那里放置你想要的任何字段和比较。这是一种更灵活的方法,但语法稍微冗长一些。