Нюансы использования проверки на неравенство в выражениях

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

Любое выражение (условие) по вопросу проверяет: а есть ли любой ответ на этот вопрос, удовлетворяющий условию? Например:

Q20 = 3

Словами это условие можно произнести так: "Есть ли в Q20 ответ с кодом 3?". Такое условие будет прекрасно работать как с вопросами с единственным выбором, так и с множественным выбором, т.к. даже если в Q20 отмечено несколько кодов - это не важно, т.к. мы проверяем только на наличие кода 3. Также подобное условие будет работать и с табличными вопросами, и звучать в этом случае оно будет: "Есть ли в любой строке Q20 ответ с кодом 3?".

С равенством (а также с другими операциями, вроде <, >, <=, >=) всё понятно. А вот когда дело доходит до проверки на неравенство... появляется непонимание. Например меняем наше условие на такое:

Q20 != 3

Мы явно хотим проверить, что в вопросе Q20 не отмечен код 3. Но! Прочитаем условие словами, по принципу описанному выше: "Есть ли в Q20 ответ с кодом не равным 3?". Вот тут и зарылась проблема... Если Q20 это вопрос с единственным выбором, то условие будет работать как ожидается, т.е. выполняться когда например в Q20 отмечен код 2, и наоборот - не выполняться, если в Q20 отметили код 3. Однако, как только вопрос становится с множественным выбором - поведение условия меняется, и в некоторых случаях приведет совсем к обратному результату. Например: в Q20 отмечен код 2 и код 3. Условие у нас Q20 != 3. По ожидаемой логике наше условие не должно выполняться, т.к. в Q20 есть ответ с кодом 3... но, условие будет выполнено! Почему? Вспомним как звучит это условие словами: "Есть ли в Q20 ответ с кодом не равным 3?". И да! Конечно есть! Это код 2. Сл-но условие будет выполнено. Иногда это даже на пользу, если понимаешь что делаешь. Например когда надо проверить именно что есть любой ответ с кодом отличным от 3, так и надо писать Q20 != 3.

Как же быть? Всё просто. Надо проверять от обратного, т.е. пишем условие так:

not Q20 = 3

И тогда всё будет верно. Мы проверяем "Есть ли в Q20 ответ с кодом 3?" и после этого инвертируем результат.

Есть ещё один момент, который надо учесть. Условие вида not Q20 = 3 сработает и тогда, когда на Q20 нет вообще никакого ответа. Обычно это не то, что нам нужно. Чтобы этого избежать, добавляем проверку на наличие хоть какого-то ответа на Q20:

Q20 and not Q20 = 3

Теперь проверка абсолютно верна.

Ещё один частый вопрос, который относится к теме данной статьи - как проверить, ответ с определённым кодом выбран один или же есть ещё другие ответы? Такая проверка бывает нужна, когда, например, надо завершить интервью, если выбран только ответ 3, и продолжить, если вместе с ним выбран другой ответ. Учитывая вышесказанное, написать такое выражение просто:

Q = 3 and not Q != 3

То есть в первой части выражения проверяем, "Есть ли в текущем вопросе ответ с кодом 3?". Во второй - "Есть ли тут же ответ с кодом не равным 3?" и инвертируем эту проверку. Таким образом, выражение выполнится, если в вопросе выбран только ответ с кодом 3.