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

问题描述 投票:1回答:3

存在一个问题。它是用基本的SQL术语设置的,但是它的性质是纯数学的(所以也许我也应该访问https://mathoverflow.net)。

我在一些理论数据库中有一个表格,里面有6个字段,都是数字。我们还有基本条件,例如Field_1> Field_5,Field_4 = 3等,总共7个条件。我需要编写一个满足其中[[至少 4个选择的选择。

写具有很多逻辑条件的长选择,例如

(cond_1 AND cond_2 AND cond_3和cond_4)OR(...)是不可行的,因为来自7个元素的4个组合等于140,而一个不包含不想写那么多条件。

那么,如何以简化形式编写选择呢?
sql database logic discrete-mathematics
3个回答
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


0
投票
您可以简单地将真实条件的总和相加,la

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

并根据condition_sum进行过滤>阈值。您甚至可以将大写和表达式的复杂性放入函数中,以使代码可读性更高。

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;

© www.soinside.com 2019 - 2024. All rights reserved.