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

标签 sql database logic discrete-mathematics

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

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

用许多逻辑条件编写长选择,例如(cond_1 AND cond_2 AND cond_3 and cond_4) OR (...)不是一种方法,因为7个元素的4组合等于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,您可以用更简单的方式编写此代码,因为 bool 结果相当于 0 或 1,因此您不需要 CASE 语句:

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

关于sql - 从可用的 M 个条件中选择至少满足 N 个条件的一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3006957/

相关文章:

php - 如何为搜索查询设置配额并避免分页占用配额

SQL Server 如何在没有 PIVOT 或 UNPIVOT 或聚合的情况下将行转置为列

mysql - 插入行时的竞争条件

sql-server - VB6 ADODB.Recordset RecordCount 属性总是返回 -1

Prolog:游戏中的每个玩家都打出一张牌。在知道谁打了哪些牌的情况下,推断出谁打了其他牌

mysql - 按列选择非重复项,字段不对应

mysql - 如何确定mysql分区数

java - 在硬件上强制执行的变量范围

java - 我的逻辑有缺陷 - Java

c# - 如果找不到数据,SQL Server 查询连续返回 "No data"