SQL - ЗАЯВЛЕНИЕ ОБ ИСПОЛЬЗОВАНИИ - WHEN инструкция AND и

17

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

У меня есть таблица 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,

Мне нужно сделать следующее:

КОГДА STATE = 2 И RetailerProcessType = 1 THEN '"УПОЛНОМОЧЕН"

WHEN STATE = 1 AND RetailerProcessType = 2 THEN '"PENDING"'

КОГДА СОСТОЯНИЕ = 2 И RetailerProcessType = 2 THEN '"AUTHORIZED"'

ELSE '"DECLINED"'

Единственный способ, которым я могу это сделать, - это иметь массивный оператор IF вокруг запроса, один для одношагового розничного торговца, а другой для двухэтапного, поскольку мое понимание - это предложение WHEN, у которого есть «И» в он.

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

Стивен

    
задан swade1987 19.01.2012 в 16:15
источник

3 ответа

35

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

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

Причина, по которой вы можете сделать И здесь, заключается в том, что вы не проверяете CASES of STATE, но вместо этого вы являетесь условиями CASING.

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

    
ответ дан Bassam Mehanni 19.01.2012 в 16:26
источник
7

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

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

    
ответ дан JNK 19.01.2012 в 16:17
источник
-1
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;
    
ответ дан Zul 26.07.2013 в 03:07
источник