Если вы очистите свой код - переименуйте имя корреляции столбца в «out» (это зарезервированное слово), измените ваши ключевые слова на прописные и т. Д. - затем в соответствии с Mimer SQL-92 validator ваш SQL является допустимым кодом промежуточного SQL-92. Следовательно, у вас должно быть разумное ожидание, что этот ванильный код SQL будет работать в любой современной реализации SQL.
К сожалению, ядро базы данных Access не является современной реализацией SQL и не совместимо с SQL-92 на любом уровне.
Проблема здесь в том, что ядро базы данных Access не поддерживает выражение CASE
. Вместо этого оно имеет собственное выражение IIF()
. Обычно я мог оправдываться, добавляя квалификатор «... потому что ядро базы данных Access делит службу выражений с VBA». Дело в том, что в этом случае это не так: выражение IIF()
в SQL-сервере базы данных Access работает иначе, чем выражение VBA IIF()
, например,
SELECT IIF(0 = 1, 55 / 0, 99)
Работает нормально, возвращает значение 99.
? IIf(0 = 1, 55 / 0, 99)
Сбой при ошибке «Ошибка деления на ноль».
FWIW, если вам нужны одинаковые VBA и SQL, рассмотрите выражение SWITCH
SELECT SWITCH(1 = 1, 55, TRUE, 55 / 0)
? Switch(1 = 1, 55, TRUE, 55 / 0)
Обе ошибки завершаются с ошибкой «Деление на ноль».
У ядра базы данных Access SQL есть выражения, которых нет в VBA (например, IS NULL
, IN()
и т. Д.), Так почему же нет выражения CASE
? Мы, вероятно, никогда не узнаем. Ядро базы данных Access плохо документировано; в частности, с самого начала никогда не было ничего особенного, то, что у нас есть, полно ошибок (материальных, а также ошибок упущений), и из-за возраста движка (т.е. старого) то, что существует, постепенно исчезает из MSDN и Microsoft. Веб-сайт. Старые эксперты Jet перешли к другим проектам.