#ms-access #required
#ms-access #требуется
Вопрос:
При преобразовании некоторых запросов Access в T-SQL я наткнулся на функцию доступа IIf. Я прочитал документацию здесь и понимаю, что она принимает 3 параметра: выражение, значение if true и значение if false. Что мне еще предстоит найти, так это то, требуется ли параметр «false»? И если значение false не указано, каково поведение?
ОБНОВЛЕНИЕ: когда был задан этот вопрос, я не знал, работает ли запрос только с 2 параметрами (b / c я не могу запустить запрос в Access). Однако я подозревал, что это может сработать (только с 2 параметрами), поскольку несколько запросов, которые я конвертирую (в T-SQL), имеют вложенные IIF, а последний IIF имеет только 2 параметра.
Комментарии:
1. Это
IIf
, и в документе, который вы связали, четко указано, что требуются все 3 параметра.2. Андре, да, вы правы, (и я знал) в документе четко указано, что все 3 обязательны. Мое замешательство возникло из-за запросов, которые мне было поручено преобразовать — некоторые из них имеют вложенные IIF, в которых конечный IFF имеет только два параметра. Обычно я бы запустил запрос и посмотрел, что произойдет, но по нескольким причинам я не могу запускать запросы. Итак, я полагаю, что моим основным мотивом было определить, каковы были намерения человека, который написал запрос в первую очередь, и определить, что должно произойти (в Access), если IIF задано только 2 параметра.
3. А, понятно. Я этого не знал. Было бы очень полезно, если бы вы добавили эту информацию (что функция фактически работает в запросах только с 2 параметрами) к вашему вопросу.
Ответ №1:
Это IIf
не IFF
так. Все аргументы требуются в выражениях VBA и текстового поля, и оба должны быть вычисляемыми (без результата ошибки, такого как DivBy0), потому что будут вычислены обе части — если любая из них ошибается, все выражение ошибается. IIf() в запросе Access работает по-другому — ‘falsepart’ вычисляется только в случае сбоя ‘truepart’, и если ‘falsepart’ не указан, выражение возвращает Null, если ‘truepart’ завершается с ошибкой.
Попробуйте несколько выражений и посмотрите, что произойдет. Один для тестирования : IIf(1=2,"T")
.
Комментарии:
1. 7 июня, 1) часть вашего ответа «IIf() в запросе работает по-другому» — это то, что я искал. 2) Я попробовал IIF в T-SQL, и «ВЫБЕРИТЕ IIf(1 = 2,’T’)» выдает ошибку «Неправильный синтаксис», если указан не 3-й аргумент, а 3) Я попробовал это в Access, и при выполнении запроса «ВЫБЕРИТЕ IIf (1 = 2, «T»)» отображается пустая ячейка. Могу ли я предположить, что «пустая ячейка» — это то, что вы подразумеваете под «возвращает Null, если ‘truepart’ завершается неудачей»?
2. Да, результат равен нулю, в отличие от пустой строки.
Ответ №2:
Дополнение к отличному ответу June7:
Вот два простых запроса, которые работают в Access SQL:
SELECT IIf(1=1, "yes")
(возвращает «да»)
SELECT IsNull(IIf(1=2, "yes"))
(возвращает -1, иначе True) — поэтому, если вы опускаете falsepart
, IIf()
возвращает действительно NULL, если expr
не оценивается как True.
Комментарии:
1. Андре, отличное дополнение, и оно очень проясняет двусмысленность. Спасибо!
Ответ №3:
Да, это обязательно, на самом деле это похоже на оператор if else .
т.е. действие выполняется, если условие выполнено, и другое действие выполняется, если условие не выполнено