Access SQL IIF Complex - PullRequest
       30

Access SQL IIF Complex

1 голос
/ 16 ноября 2011

Я пытаюсь изменить состояние данных одного столбца на другое с помощью операторов iif (т.е.: iif([major]="eet","electronic engineering technology")).

Я работал до тех пор, пока не добавил новый мажор в группу под названием PLS. У меня есть окно, в котором говорится, что выражение слишком сложное.

Когда я вынимаю это, оно отлично работает. Существует ли ограничение на количество операторов iif для доступа?

Majors: IIf([Major]="EET","Electronics Engineering Technology",
IIf([Major]="DMA","Digital Media Arts Technology",
IIf([Major]="BAM","Business Administration - Management ",
IIf([Major]="Ess","Industrial Electronics Technology - Electronic Security Systems",
IIf([Major]="FMT","Facilities Management Technology",
IIf([Major]="FMTC","Facilities Management Technology Certificate",
IIf([Major]="HIT","Health Information Technology",
IIf([Major]="HSE","Human Services",
IIf([Major]="HVAC","Heating, Ventilation, Air Conditioning and Refrigeration Technology",
IIf([Major]="IENET","Industrial Electronics Technology - Computer and Networking Track",
IIf([Major]="Auto","Automotive Technology",
IIf([Major]="AT","Accounting Technology",
IIf([Major]="IETC","Industrial Electronics Technology-  Computer Track",
IIf([Major]="IETR","Industrial Electronics Technology - Railway Electronics Systems",
IIf([Major]="PLS","test","Ophthalmic Dispensing"))))))))))))))

Ответы [ 6 ]

1 голос
/ 16 ноября 2011

Одним из вариантов будет использование оператора Switch () вместо IIf ():

Majors: Switch([Major]="EET","Electronics Engineering Technology",
               [Major]="DMA","Digital Media Arts Technology",
               ...,
               [Major]="PLS","test",
               True, "Ophthalmic Dispensing")

Хотя функция переключения VBA, по-видимому, принимает большое количество параметров (я прошел 22 уровня глубиной, прежде чем прекратил тестирование), реализация Switch / Jet dB в Jet / ACE ограничена максимум 14 уровнями. Как вы правильно заметили, он задыхается от 15 и более.

Похоже, что таблица поиска (описанная ниже) остается единственной практической опцией. (Существуют и другие, менее практичные варианты, такие как написание собственной функции Switch (), которая принимает произвольно большое количество параметров, но я думаю, что глупо, когда таблица поиска является таким очевидным выбором).


Лучшим вариантом было бы создать справочную таблицу и присоединить ее к вашему запросу. Используйте ВНУТРЕННЕЕ СОЕДИНЕНИЕ, если вы можете быть уверены, что в таблице поиска будет строка для каждой аббревиатуры "Major". Используйте ВНЕШНЕЕ СОЕДИНЕНИЕ с Nz () или IIf (), если не уверены.

0 голосов
/ 11 июля 2019

Я попал сюда после достижения предела для функции переключения в MS Access.На случай, если это поможет кому-нибудь на моем месте, вот что я сделал.

Я достиг предела для переключателя в 10. Что мне помогло, так это использование & для объединения двух операторов переключателя.

Switch(CityName = "London", "English", 
              CityName = "Rome", "Italian", 
              CityName = "Paris", "French") code here
&
Switch(CityName = "New York", "English", 
              CityName = "Turin", "Italian", 
              CityName = "Bourgogne", "French")
0 голосов
/ 17 ноября 2011

Что я собираюсь сделать, это создать отдельные запросы для каждого основного и затем передать либо IIF или коммутатор.В конце концов, это помогает конечному пользователю экспортировать данные в powerpoint, потому что им не придется сортировать данные.

0 голосов
/ 17 ноября 2011

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

0 голосов
/ 17 ноября 2011

Я бы запустил цикл VBA с таким запросом, как этот

UPDATE TableName SET Major = [LongName] WHERE Major = [ShortName]

где [LongName] и [ShortName] являются параметрами.

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

0 голосов
/ 17 ноября 2011

Если у вас есть серверная часть, расположенная на MS SQL Server, и вы подключаете свои таблицы через ODBC, вы можете использовать оператор CASE WHEN THEN END CASE в коде SQL, но в MS Access вы не можете.

Ограничение, на которое вы, вероятно, натолкнетесь, - это ограничение глубины стека для запросов SQL: каждое вложенное выражение требует, чтобы анализатор запросов пошел еще на один шаг глубже, и в определенный момент времени ваш стек истощается, а затем происходит сбой. Кроме того, существует ограничение на общее количество символов в запросе SQL, но оно достаточно велико и должно быть в порядке.

Возможное быстрое решение для вашего решения (хотя оно делает ваш запрос более медленным) состоит в том, чтобы поместить значения в отдельную таблицу и выполнить поиск, используя функцию DLookUp(Table, Field, Criteria) в MS Access. В качестве альтернативы вы можете просто присоединить таблицу к своим аббревиатурам, а затем преобразовать запрос в полноценную таблицу (или материализованное представление).

...