SQL - CASE STATEMENT - WHEN оператор и оператор - PullRequest
27 голосов
/ 19 января 2012

У меня возникла проблема, пытаясь найти самое подходящее решение для следующей проблемы.

У меня есть таблица с названием «Покупка», в которой есть столбец «Состояние», где 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.

Однако, это просто кажется многословным;У кого-нибудь есть более аккуратные идеи?

Ответы [ 3 ]

51 голосов
/ 19 января 2012

Вы можете сделать это следующим образом:

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

8 голосов
/ 19 января 2012

Просто слегка измените свой синтаксис:

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, вы можете поместить в него практически любые поля и сравнения, которые вы хотите,Это более гибкий метод, но с немного более подробным синтаксисом.

0 голосов
/ 26 июля 2013
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;
...