SQL:简化和/或查询多个列

时间:2017-07-08 10:41:26

标签: mysql sql

我有一张名为employe的表,其中包含以下内容

id A B C D E F G
1  8 4 6 3 2 5 2
1  7 3 1 2 1 3 7
3  9 2 3 3 2 6 1
4  6 1 2 4 5 5 7
4  6 4 6 3 2 5 2

我这样做一个查询

employe.where( 
   A > 7 & 
(

 (C<3 & D<3 & E<3 & F<3 & G<3) 
|(B<3 & D<3 & E<3 & F<3 & G<3)
|(B<3 & C<3 & E<3 & F<3 & G<3)  
|(B<3 & C<3 & D<3 & F<3 & G<3)
|(B<3 & C<3 & D<3 & E<3 & G<3)
|(B<3 & C<3 & D<3 & E<3 & F<3)

)
)

有没有办法简化上述查询?因为我的表中有超过20列,所以我对所有列都进行了上述查询。它在每一行看起来都很丑陋和相同的代码。即使我能做到这样的事情也会很好看

q1 = [C, D, E, F, G]
q2 = [B, D, E, F, G]
q3 = [B, C, E, F, G]
q4 = [B, C, D, F, G]
q5 = [B, C, D, E, G]
q6 = [B, C, D, E, F]
employe.where( 
   A > 7 & 
(
  q1<3 | q2<3 | q4<4 | q5<3 | q6<3
)
)

2 个答案:

答案 0 :(得分:0)

我没有要检查的MySQL,但可以执行以下操作:

SELECT * FROM @employee e
INNER JOIN (SELECT id, A, 
CASE WHEN a < 3 THEN 0 ELSE 1 END +  
CASE WHEN b < 3 THEN 0 ELSE 1 END +  
CASE WHEN c < 3 THEN 0 ELSE 1 END +  
CASE WHEN d < 3 THEN 0 ELSE 1 END +  
CASE WHEN e < 3 THEN 0 ELSE 1 END +  
CASE WHEN f < 3 THEN 0 ELSE 1 END +  
CASE WHEN g < 3 THEN 0 ELSE 1 END as cnt from @employee) c  
on e.id = c.id
WHERE e.A > 7 AND c.cnt < 3

如果我理解正确,你试图找到一列大于7的实例,其他五列中至少有四列少于三列。我的例子通过简单的逻辑技巧实现了这一点(对于所有列)。如果您计算A-G的所有不小于3的实例,并检查任何列是否小于3,其中该列是> 7,然后你知道其他人最多不少于3,因为列本身是2中不少于3的一个。

扩展您获得的所有列的示例

SELECT * FROM @employee e
INNER JOIN (SELECT id, 
CASE WHEN a < 3 THEN 0 ELSE 1 END +  
CASE WHEN b < 3 THEN 0 ELSE 1 END +  
CASE WHEN c < 3 THEN 0 ELSE 1 END +  
CASE WHEN d < 3 THEN 0 ELSE 1 END +  
CASE WHEN e < 3 THEN 0 ELSE 1 END +  
CASE WHEN f < 3 THEN 0 ELSE 1 END +  
CASE WHEN g < 3 THEN 0 ELSE 1 END as cnt from @employee) c  
on e.id = c.id
WHERE (e.A > 7 OR e.B > 7 OR e.C > 7 OR e.D > 7 OR e.F > 7 or e.G > 7) 
AND c.cnt < 3

答案 1 :(得分:0)

如果列表中的所有值(列)必须小于3,则此列表中的最大值也必须小于3,因此您可以使用greatest函数,例如:

Where
  Greatest( c, d, e, f, g ) < 3
  Or
  Greatest( b, d, e, f, g ) < 3
  Or
  Greatest( b, c, d, e, f ) < 3
  Or
  .....