Как проверить состояние в базе данных Access - PullRequest
1 голос
/ 23 июня 2009

Использование базы данных Access

Как использовать условие case?

Мой запрос

Select 
    ID, 
    Name, 
    Intime, 
    case when Outtime=Intime then ‘000000’ else Outtime end as Out 
from table

Приведенный выше запрос принимался в SQL 2000, но не принимался в базе данных Access

Как мне проверить условия?

Нужна помощь по запросу.

Ответы [ 4 ]

4 голосов
/ 23 июня 2009

Полагаю, вы можете использовать функцию IIF.

Select ID, Name, Intime, IIF(Outtime=Intime,‘000000’,Outtime) as Out
from table

Взят прямо из документации:

IIf (expr, truepart, falsepart)

Синтаксис функции IIf имеет эти аргументы

 Argument  |  Description  
 expr      |  Required. Expression you want to evaluate.  
 truepart  |  Required. Value or expression returned if expr is True.
 falsepart |  Required. Value or expression returned if expr is False.

Примечания

IIf всегда оценивает как truepart, так и falsepart, даже если он возвращает только один из них. Из-за этого ты следует следить за нежелательной стороной последствия. Например, при оценке falsepart приводит к делению на нулевая ошибка, ошибка возникает, даже если expr - True.

1 голос
/ 24 июня 2009

Access SQL имеет несколько встроенных функций, которые обеспечивают условную оценку скалярных значений. IIf (уже упоминалось) оценивает одно условие и возвращает одно из двух значений. Может быть произвольно вложенным. Также есть оператор Switch, который принимает произвольно длинный ряд пар аргументов. Если первый аргумент равен true, возвращается второй аргумент, если третий аргумент равен true, возвращается четвертый и т. Д.

Switch(outtime=intime, '000000', 
       outtime='something else', 'some other value', 
       true, 'default value')

Похоже, IIf - лучший вариант для вашего конкретного случая, но для определенных ситуаций, Switch может быть хорошей альтернативой.

1 голос
/ 23 июня 2009

MS Access использует JET SQL , а не T-SQL, как в MSSQL.

0 голосов
/ 24 июня 2009

Если вы очистите свой код - переименуйте имя корреляции столбца в «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 перешли к другим проектам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...