SQL - CASE STATEMENT - WHEN语句AND语句

swa*_*987 30 t-sql

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

我有一个表有一个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,
Run Code Online (Sandbox Code Playgroud)

但我需要做的是如下:

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"'
Run Code Online (Sandbox Code Playgroud)

我能想到这样做的唯一方法是在查询周围有一个大量的IF语句,一个用于一步零售商,另一个用于两步,因为我的理解是一个IF子句不能有一个"AND".

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

Bas*_*nni 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
Run Code Online (Sandbox Code Playgroud)

你在这里做AND的原因是你没有检查状态的CASES,而是你是CASING条件.

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


JNK*_*JNK 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
Run Code Online (Sandbox Code Playgroud)

如果你没有在CASE语句之前放置字段表达式,你可以在那里放置你想要的任何字段和比较.这是一种更灵活的方法,但语法稍微冗长一些.