Как улучшить регистр, который использует два столбца
У меня есть таблица с названием "Покупка", в которой есть столбец "Состояние", где 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
.
Тем не менее, это просто кажется многословным; У кого-нибудь есть более аккуратные идеи?
Ответы
Ответ 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;