IIF-запрос с использованием операторов OR не работает - PullRequest
5 голосов
/ 16 февраля 2012

Я пытаюсь выполнить следующие критерии в запросе доступа MS. В основном то, что я хочу сделать, это:

  • Если флажок = Истина, тогда отображаются все записи, в том числе с пустыми полями или пустыми полями (значение по умолчанию в поле со списком моей формы [combo9] равно "*")
  • Если флажок = Ложь, то отображаются только записи, соответствующие значению в Combo9

Мое текущее выражение не дает никаких ошибок, но также не дает никаких результатов! Половины TRUE и FALSE выражения работают нормально самостоятельно, но не работают при объединении в выражение iif.

Like IIf([Forms]![F_leg_reg]![Check25]=True,Like [Forms]![F_leg_reg]![Combo9] Or "" Or Is Null,Like [Forms]![F_leg_reg]![Combo9])

Может кто-нибудь сказать мне, что я здесь не так делаю? Заранее спасибо.

Ответы [ 3 ]

8 голосов
/ 16 февраля 2012

Не уверен, что вам нужно столько likes, вы используете логический оператор or в возвращаемом значении, которое не имеет смысла

IIF (condition, value-if-true, value-if-false)

так ..

Like IIF ([forms]![foo].[text1] = "1" OR [forms]![foo].[text2] = "1", 'bar', 'foobar')

если любое из условий выполнено, IIF вернет 'bar', иначе вернет 'foobar'

вы можете вложить его, если хотите

Like IIF ([forms]![foo].[text1] = "1" OR [forms]![foo].[text2] = "1", 'bar', 
        IIF ([forms]![foo].[text1] = "2" AND [forms]![foo].[text2] = "2", 'foobar', null)
    )

если любое из условий выполнено, IIF вернет 'bar', иначе мы проверяем, являются ли text1 и text2 "2", если так, то возвращаем 'foobar', иначе мы возвращаем null

надеюсь, это поможет

1 голос
/ 16 июля 2013

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

Проблема в том, где находится ваше заявление Iif. Поскольку вы используете Access, вы, вероятно, размещаете инструкцию Iif в строке Criteria в представлении конструктора запросов. Удалить это. Вместо этого вам нужно сделать оператор Iif своим собственным полем в запросе.

Вы также должны быть очень осторожны с опораторами, которые вы используете с Null и "*". Синтаксис очень обидчив.

В новом поле запроса введите:

IIf([Combo_Box] Is Null,[Field1] Is Null Or [Field1] Like "*",[Field1]=[Combo_Box])

Затем установите критерии для этого поля как <> False.

SQL будет выглядеть так:

SELECT [Field1], [Field2], etc
FROM Table1
WHERE (IIf([Combo_Box] Is Null,[Field1] Is Null Or [Field1] Like "*",[Field1]=[Combo_Box])<>False);

Надеюсь, это поможет! Извините за опоздание на вечеринку!

1 голос
/ 16 февраля 2012

Вы повторяете ключевое слово Like в выражении IIf (). Это не сработает. Вы могли бы исправить IIf (), но я бы использовал другой подход ... который лучше подходит моему мозгу.

Возвращает все строки, когда флажок установлен, но не строки, если не отмечен.

SELECT a_field, another_field, field_2_search 
FROM YourTable
WHERE [Forms]![F_leg_reg]![Check25]=True;

Если флажок снят, ограничьте строки теми, где значения field_2_search содержат значение комбо.

SELECT a_field, another_field, field_2_search
FROM YourTable
WHERE
    [Forms]![F_leg_reg]![Check25]=False
    AND field_2_search Like "*" & [Forms]![F_leg_reg]![Combo9] & "*";

Но вам нужен только один запрос, а не два, поэтому объедините эти предложения WHERE с ИЛИ.

SELECT a_field, another_field, field_2_search 
FROM YourTable
WHERE
    [Forms]![F_leg_reg]![Check25]=True
    OR (
    [Forms]![F_leg_reg]![Check25]=False
    AND field_2_search Like "*" & [Forms]![F_leg_reg]![Combo9] & "*"
    );
...