Булева логика и фильтры: вопросы для собеседования (часть 2)
AND, OR, NOT, законы де Моргана, приоритет операторов — булева логика лежит в основе фильтрации данных в SQL и Python. На собеседовании дают сложное условие с вложенными AND/OR и просят определить, какие строки пройдут фильтр. Ошибки в логических выражениях — одна из самых частых причин неправильных результатов.
Вопросы 6–10 из 20
6В форме регистрации есть два флага: `has_email = 1` и `has_phone = 1`. Что означает фильтр `NOT (has_email = 1) AND NOT (has_phone = 1)`?
AУ пользователя указан хотя бы один контакт: `has_email = 1 OR has_phone = 1` после преобразования
BУ пользователя указаны оба контакта одновременно: `has_email = 1 AND has_phone = 1`
CУ пользователя не указан ни один контакт: ложно и `has_email = 1`, и `has_phone = 1`
DУ пользователя указан ровно один контакт: один из флагов равен 1, а другой 0
Ответ: Связка `NOT A AND NOT B` означает, что не выполнено ни одно из двух условий.
Чтобы строка прошла фильтр, должны быть ложными оба условия: и `has_email = 1`, и `has_phone = 1`. Это случай, когда не указан ни один контакт. Частая ошибка — путать с `NOT (A AND B)`, что по закону Де Моргана равно `NOT A OR NOT B` и допускает заполнение одного контакта из двух.
Подробный разбор → 7Какому выражению со скобками эквивалентно условие `is_new = 1 OR is_paying = 1 AND has_coupon = 1`, если `AND` выполняется раньше `OR`?
A`is_new = 1 OR (is_paying = 1 AND has_coupon = 1)`
B`(is_new = 1 OR is_paying = 1) AND has_coupon = 1`
C`(is_new = 1 AND is_paying = 1) OR has_coupon = 1`
D`is_new = 1 AND (is_paying = 1 OR has_coupon = 1)`
Ответ: `AND` имеет более высокий приоритет, поэтому сначала вычисляется `is_paying = 1 AND has_coupon = 1`.
В выражениях фильтрации `AND` обычно выполняется раньше `OR`. Поэтому запись без скобок читается как `is_new = 1 OR (is_paying = 1 AND has_coupon = 1)`. Если вы хотели сгруппировать иначе, добавьте скобки и не полагайтесь на приоритет операторов.
Подробный разбор → 8Вы хотите выбрать строки, которые не относятся к `country = 'RU' OR country = 'KZ'`. Какое выражение соответствует `NOT (country = 'RU' OR country = 'KZ')` по правилу де Моргана?
A`NOT (country = 'RU') OR NOT (country = 'KZ')`
B`country <> 'RU' OR country <> 'KZ'`
C`country = 'RU' AND country = 'KZ'`
D`NOT (country = 'RU') AND NOT (country = 'KZ')`
Ответ: По правилу де Моргана `NOT (A OR B)` эквивалентно `NOT A AND NOT B` — оба условия должны быть ложны.
Условие `country = 'RU' OR country = 'KZ'` означает «RU или KZ», то есть хотя бы одно из двух. Его отрицание — это «ни RU, ни KZ», то есть `NOT (country = 'RU') AND NOT (country = 'KZ')`. Частая ошибка — написать `OR` вместо `AND` в отрицании: получится условие, которое почти всегда истинно и пропускает лишние строки в выборку.
Подробный разбор → 9Флаг `is_active` принимает только 0 или 1. Какое условие истинно для любой строки и не отфильтрует ни одной?
A`is_active = 1 AND is_active = 0`
B`NOT (is_active = 1) AND is_active = 1`
C`is_active = 1 OR is_active = 0`
D`is_active = 1 AND NOT (is_active = 0)`
Ответ: Если флаг может быть только 0 или 1, то `is_active = 1 OR is_active = 0` истинно для любой строки и является тавтологией.
Это пример тавтологии: вы перечислили все возможные значения флага и соединили их `OR`. Такой фильтр часто появляется случайно, например при ошибочном объединении условий. На собеседовании полезно уметь быстро распознавать всегда истинные условия, потому что они маскируют ошибки сегментации.
Подробный разбор → 10Поле `country` содержит ровно одно значение на пользователя. Какое условие в фильтре никогда не будет истинным?
A`country = 'RU' OR country = 'KZ'` без других условий
B`country = 'RU' AND country = 'KZ'` без других условий
C`NOT (country = 'RU') AND country IS NOT NULL`
D`(country = 'RU' OR country = 'KZ') AND NOT (country = 'BY')`
Ответ: Условие `country = 'RU' AND country = 'KZ'` невозможно для одного поля и поэтому всегда ложно.
Противоречия часто появляются, когда по ошибке объединяют взаимоисключающие значения через `AND`. В результате фильтр возвращает пустой набор, и аналитик начинает искать проблему в данных, а не в логике запроса. На собеседовании важно быстро распознавать такие невозможные условия и объяснять, почему они не могут выполниться: одно поле не может одновременно содержать два разных значения.
Подробный разбор →