2013-04-30 6 views
1

Я в основном работаю с SQL Server и редко использую Access. У меня есть аргумент case на SQL-сервере, который мне нужно превратить в вложенное заявление IIF в Access, и мне сложно с ним работать. Код SQL:Преобразование CASE WHEN в IIF

(CASE 
    WHEN (RRDD = '2029' 
     THEN 'IS' 
    WHEN RRDD = '2214' OR '2219' OR '2220' OR '2221' OR '2230' OR '2265' 
     THEN 'AIR' 
    WHEN RRDD = '2044' OR '2323' OR '2327' OR '2331' OR '2339' 
     THEN 'LogDist' 
    WHEN RRDD = '2037' 
     THEN 'MailInn' 
    WHEN RRDD = '2213' OR '2307' OR '2311' OR '2332' OR '2334' OR '2338' 
      OR '2705' OR '2706' 
     THEN 'GFF' 
    WHEN RRDD = '2010' 
     THEN 'Corp' 
    WHEN RRDD = '2040' OR '2041' OR '2081' OR '2086' 
     THEN 'Cap' 
     ELSE NULL 
END) AS RegDIs 
+5

Я бы предложил создать небольшую таблицу поиска с помощью «RRDD» и «RegDI», а затем просто использовать соединение для поиска нужного значения. –

+1

Выражение 'CASE' недопустимо даже в SQL-Server. –

+2

Создайте вторую таблицу с идентификаторами и их именами, чтобы присоединиться к ним. Утверждение оператора 'CASE' или' IIF' для решения этой проблемы в лучшем случае глупо. – Zane

ответ

3

Настоящий случай сумасшедший - подумайте о переходе во внешний стол. Фактически это не будет выполняться как есть - например, у вас есть дополнительные круглые скобки и неправильно используются OR.

С учетом сказанного, в основном вам нужно заменить КОГДА с IIF (а потом с запятой и включают в свой следующий IIF в качестве окончательного В параметре - это должно быть близко:

(IIF(RRDD = '2029', 'IS', 
    IIF(RRDD IN ('2214', '2219', '2220', '2221', '2230', '2265'), 'AIR', 
    IIF(RRDD IN ('2044', '2323', '2327', '2331', '2339'), 'LogDist', 
    IIF(RRDD = '2037', 'MailInn', 
    IIF(RRDD IN ('2213', '2307', '2311', '2332', '2334', '2338', '2705', '2706'), 'GFF', 
    IIF(RRDD = '2010', 'Corp', 
    IIF(RRDD IN ('2040', '2041', '2081', '2086'), 'Cap', 
    NULL)))))))) AS RegDIs 
+0

О, вау, большое спасибо за вашу помощь – user2119980

+0

@ user2119980 - np, рад, что мы могли бы помочь. – sgeddes

+4

Мне нравится, что это * можно * сделать, но я бы никогда не защищал его. – valverij

0

Ваш исходный код неверен. вы не можете сказать, RRDD = '2044' OR '2323' вы можете сказать:.. RRDD = '2044' OR RRDD = '2323' или, вы можете использовать in

функция iif доступа имеет только «тогда» и «другое» положение Таким образом, вы должны гнездиться звонки

...

Это делает код немного более громоздким. И отслеживание закрывающих круглых скобок может стать кошмаром. Как я предлагаю в своем комментарии, небольшая справочная таблица будет гораздо более элегантным решением.

Вот код, используя iif:

select iif(RRDD = '2029', 'IS', 
      iif(RRDD in ('2214', '2219', '2220', '2221', '2230', '2265'), 'AIR', 
       iif(RRDD in ('2044', '2323', '2327', '2331', '2339'), 'LogDist', 
        iif(RRDD = '2037', 'MailInn', 
         iif(RRDD in ('2213', '2307', '2311', '2332', '2334', '2338', '2705', '2706'), 'GFF', 
          iif(RRDD = '2010', 'Corp', 
           iif(RRDD in ('2040', '2041', '2081', '2086'), 'Cap', NULL 
            ) 
           ) 
          ) 
         ) 
        ) 
       ) 
      ) AS RegDI) 
3

Рассмотрим Switch в качестве альтернативы кратному IIf выражений.

Switch 
    (
     RRDD = '2029', 'IS', 
     RRDD IN ('2214','2219','2220','2221','2230','2265'), 'AIR', 
     RRDD IN ('2044','2323','2327','2331','2339'), 'LogDist', 
     RRDD = '2037', 'MailInn', 
     RRDD IN ('2213','2307','2311','2332','2334','2338','2705','2706'), 'GFF', 
     RRDD = '2010', 'Corp', 
     RRDD IN ('2040','2041','2081','2086'), 'Cap' 
    ) AS RegDIs 

С Switch, когда ни один из матча условия, функция не возвращает Null.

Я нахожу Switch более понятным, особенно если число IIfs настолько велико, сколько вам нужно.

Тем не менее, подход Switch или IIf сводится к записи данных в оператор SQL. Как упоминалось выше, я думаю, что таблица поиска будет лучшим подходом.

RRDD RegDIs 
2029 IS 
2214 AIR 
2219 AIR 
2220 AIR 

Редактировать таблицу, если необходимо, необходимо просто отредактировать сложный запрос.

Смежные вопросы