Выражения case в Access
Можете ли вы использовать выражения case
в Access? Я пытаюсь определить столбцы максимальной формы даты 2, но продолжаю получать синтаксические ошибки в следующем коде:
CASE
WHEN dbo_tbl_property.LASTSERVICEDATE > Contour_dates.[Last CP12 Date]
THEN dbo_tbl_property.LASTSERVICEDATE
ELSE Contour_dates.[Last CP12 Date]
END AS MaxDate
Ответы
Ответ 1
Вместо этого вы можете использовать функцию IIF()
.
IIF(condition, valueiftrue, valueiffalse)
-
condition
- это значение, которое вы хотите проверить.
-
valueiftrue
- это значение, которое возвращается, если условие имеет значение TRUE.
-
valueiffalse
- это значение, которое возвращается, если условие принимает значение FALSE.
Существует также функция Switch
которая проще в использовании и понимании, когда у вас есть несколько условий для тестирования:
Switch( expr-1, value-1 [, expr-2, value-2 ] … [, expr-n, value-n ] )
Список аргументов функции Switch состоит из пар выражений и значений. Выражения оцениваются слева направо, и возвращается значение, связанное с первым выражением для оценки True. Если части не правильно спарены, возникает ошибка времени выполнения. Например, если expr-1 имеет значение True, коммутатор возвращает значение-1. Если expr-1 - False, но expr-2 - True, Switch возвращает значение-2 и т.д.
Коммутатор возвращает значение Null, если:
ПРИМЕЧАНИЕ. Переключатель оценивает все выражения, даже если он возвращает только один из них. По этой причине вам следует следить за нежелательными побочными эффектами. Например, если оценка любого выражения приводит к делению на нулевую ошибку, возникает ошибка.
Ответ 2
В Access нет оператора case. Вместо этого вы можете использовать оператор switch. Он будет выглядеть примерно так:
switch(dbo_tbl_property.LASTSERVICEDATE > Contour_dates.[Last CP12 Date],dbo_tbl_property.LASTSERVICEDATE,dbo_tbl_property.LASTSERVICEDATE <= Contour_dates.[Last CP12 Date],Contour_dates.[Last CP12 Date])
Для дальнейшего чтения посмотрите:
http://www.techonthenet.com/access/functions/advanced/switch.php
Или пример реализации функции case в VBA:
http://ewbi.blogs.com/develops/2006/02/adding_case_to_.html
С уважением,
J.
Ответ 3
FWIW - IIF - это перетаскивание, и решение коммутатора кажется недействительным для SQL (возможно, я сделал что-то не так). Я ввел значения, которые Fionnuala предложил в новую таблицу с именем AccessObjectXref:
ID ObjectType ObjectDesc 1 -32768 Форма 2 -32766 Макро 3 -32764 Report 4 -32761 Модуль 5 -32758 Пользователи 6 -32757 DB Document 7 1 Таблица 8 2 DB 9 3 Контейнер 10 5 Запрос 11 8 Подкатегория
Затем для создания списка имен объектов и их счетчиков использовался следующий SQL. Очевидно, вы могли бы включить каждую запись, если хотите:
SELECT objectdesc, Count(*) AS Expr1
FROM msysobjects, AccessObjectTypeXref
where type = objecttype group by objectdesc order by objectdesc
Я получил список типов объектов:
Значение значений MsysObjects