从M可用中选择哪个满足至少N个条件

时间:2010-06-09 14:52:24

标签: sql database logic discrete-mathematics

有一个问题浮出水面。它是用基本的SQL术语设置的,但它的本质是纯数学(所以也许我也应该访问http://mathoverflow.com。)

我在一些理论数据库中有一个表,有6个字段,都是数字。我们也有基本条件,例如Field_1> Field_5,Field_4 = 3等,总共7个条件。我需要写一个select,它满足至少 4个。

写入looooooooooooooooooooooooooong选择具有许多逻辑条件,例如(cond_1 AND cond_2 AND cond_3和cond_4)OR(...)不是一种方式,因为7个元素的4组合等于140 ,一个人不想写这么多条件。

那么如何以简化形式编写选择?

3 个答案:

答案 0 :(得分:6)

这样做的一种方法是对行满足的每个条件计数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,因此您不需要CASE语句:

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

答案 1 :(得分:0)

你可以简单地将真实条件的总和加在一起,一个

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

并在condition_sum>上过滤门限。你甚至可以把这个sum-of-cases表达式的肮脏性放到一个函数中,以获得稍微更易读的代码。

答案 2 :(得分:0)

我建议只计算满足多少条件。具体的语法将取决于您使用的是哪个数据库管理引擎,但在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;
相关问题