1

有一个问题浮出水面。它是用基本的 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 (...)等许多逻辑条件编写 long select不是一种方法,因为 7 个元素的 4 组合等于 140,并且不想这样写很多条件。

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

4

3 回答 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
于 2010-06-09T14:58:06.837 回答
0

您可以简单地将真实条件的总和相加,a 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 > 阈值。您甚至可以将这种讨厌的案例总和表达式放入一个函数中以获得更易读的代码。

于 2010-06-09T14:58:21.563 回答
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;
于 2010-06-09T14:58:23.693 回答