有一个问题浮出水面。它是用基本的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 ,一个人不想写这么多条件。
那么如何以简化形式编写选择?
答案 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;