Подтвердить что ты не робот

Как улучшить регистр, который использует два столбца

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

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

4b9b3361

Ответ 1

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

-- 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 of STATE, но вместо этого вы выполняете CASING Условия.

Ключевая часть здесь состоит в том, что условие STATE является частью WHEN.

Ответ 2

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

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

Ответ 3

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;