Выберите, который удовлетворяет как минимум в условиях от M доступен

StackOverflow https://stackoverflow.com/questions/3006957

Вопрос

Есть вопрос плавался. Он установлен в основных условиях SQL, но его природа чистая математика (так что, возможно, я должен посетить http://mathoverflow.com. слишком).

У меня есть таблица в какой-то теоретической базе данных с 6 полями, все номера. Также у нас есть основные условия, такие как Field_1> Field_5, Field_4 = 3 и т. Д., 7 Условия Всего. Мне нужно написать выбрать, который удовлетворяет по меньшей мере 4 из них.

Написание LOOOOOOOOOOOOOOOOOOOOOOOOOOOOON SELECT со многими логическими условиями, такими как (cond_1 и cond_2 и cond_3 и cond_4) или (...) Это не способ, потому что 4-комбинация от 7 элементов равна 140, и человек не хочет писать так много условий.

Итак, как я могу написать выбранный в его упрощенной форме?

Это было полезно?

Решение

Один из способов сделать это - сосчитать 1 для каждого условия, что ряд удовлетворяет и сравнивает сумму на ваше целевое значение:

SELECT * 
FROM yourtable
WHERE (
          (CASE WHEN condition1 THEN 1 ELSE 0 END) +
          (CASE WHEN condition2 THEN 1 ELSE 0 END) +
          ...
          (CASE WHEN condition7 THEN 1 ELSE 0 END)
      ) >= 4

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

Если вы используете MySQL, вы можете написать это в гораздо более простом способом, потому что булевой результат эквивалентен 0 или 1, поэтому вам не нужны операторы дела:

WHERE (condition1) + (condition2) + ... + (condition7) >= 4

Другие советы

Вы можете просто добавить сумму истинные условия вместе, ля

CASE 
WHEN Field1 > Field5 THEN
    1
ELSE
    0
END
+
CASE
WHEN Field4 = 3 THEN
    1
ELSE
    0
END
+
etc
AS condition_sum

и фильтр на условиях /sum> Threshhold. Вы могли бы даже поставить настенность этой суммы выражения случаев в функцию для немного более читаемого кода.

Я бы предложил просто рассчитывать, сколько условий удовлетворены. Определенный синтаксис будет зависеть от того, в каком двигателе управления базами данных вы используете, но в MySQL он будет выглядеть что-то подобное:

SELECT things
FROM places
WHERE IF(cond_1, 1, 0) + IF(cond_2, 1, 0) + IF(cond_3, 1, 0) + IF(cond_4, 1, 0) + IF(cond_5, 1, 0) >= 4;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top