【问题标题】:Select which satisfies at least N conditions from M available从M个可用中选择满足至少N个条件的
【发布时间】:2010-06-09 14:52:23
【问题描述】:

有一个问题浮出水面。它是用基本的 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 ,不想写这么多条件。

那么我该如何写一个简化形式的选择呢?

【问题讨论】:

  • 您使用的是什么数据库?类型和版本?

标签: sql database logic discrete-mathematics


【解决方案1】:

一种方法是对行满足的每个条件计数 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

【讨论】:

  • 这不是性能或数据库版本的问题,实际上,问题是理论上的,应该在纯 SQL 中完成,而不是像 PL/SQL 这样的扩展,但我更喜欢 Oracle。感谢您提供更广泛的答案,顺便说一句,这似乎是真的,但迈克伯顿是第一个。
  • 其实马克是第一个15秒左右,总体来说答案比较好,所以你不妨把他的记下来。
  • 好的,如你所愿,但我现在对这两个答案都有一些疑问。他们不是提供表中的所有行,如果任何字段都满足 4 个条件,而不是只提供 ROWS,哪些字段至少满足 4 个条件?
  • @Chaotic_one:WHERE 子句单独应用于每一行。结果集中仅返回满足四个或更多条件的行。那就是我相信你想要的。
  • 是的,当我输入我的疑问时,我明白了 :) 我现在正在运行测试,我相信结果会很棒。感谢您的精彩回答!
【解决方案2】:

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

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

并根据 condition_sum > 阈值进行过滤。您甚至可以将这种讨厌的案例总和表达式放入一个函数中以获得更易读的代码。

【讨论】:

    【解决方案3】:

    我建议简单地计算满足多少条件。具体语法取决于您使用的数据库管理引擎,但在 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-03
      • 2019-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-22
      相关资源
      最近更新 更多