对于n个条件中有大于等于或小于m个条件成立时符合要求的sql 条件语句的写法...

假设的应用场景 

我假定博客园要在首页为群组开辟一块空间,推广小组,小组能在首页显示的条件有四个:

1.       页面点击量大于10w

2.       小组人数大于1000

3.       小组帖子数大于10000

4.       小组在2007年之前创建

现在假定4个条件都满足的小组只有两个,太少了,推广位可以推广10个小组;这时候运营人员要求这4个条件中满足3个但是第4个条件不满足的小组算符合条件的小组,如果4个条件都满足就认为这个小组太火了,不需要在首页推广它了。业务逻辑想清楚了,下一步就该写代码了,数据逻辑层的代码的任务假定交给我了,我要考虑满足4个条件中3个成立的sql怎么写。

为了叙事方便,我们假如小组表的名字为Group,相关的条件字段是Pv,UserCount,PostCount,CreateTime:分别表示小组的点击量,人数,帖子数,创建时间

我来写sql语句,上面的四个条件满足至少3个,有多少种情况呢?这是一个组合问题,一共有多少种的公式我已经忘记了,我要根据感觉写写看:

SELECT   *   FROM   Group
WHERE   (Pv > 100000   AND  UserCount > 1000   AND  PostCount > 10000   AND  CreateTime  >   20070101
OR  (Pv > 100000   AND  UserCount > 1000   AND  PostCount < 10000   AND  CreateTime  <   20070101 )
OR  (Pv > 100000   AND  UserCount < 1000   AND  PostCount > 10000   AND  CreateTime  <   20070101 )

这个Sql语句条件还行,但是我们的题目是n个条件m个条件成立,如果多了还这么写,恐怕就很累了,能不能改进呢?答案是肯定的,要不我就不写这篇随笔了,呵呵

SELECT   *   FROM   Group
WHERE  
(
CASE  Pv  WHEN  Pv > 100000   THEN   1   ELSE   0   END -- 这是PV的条件成立则为1,否则为0
+ ( CASE  UserCount  WHEN  UserCount  >   1000   THEN   1   ELSE   0   END -- 用户数条件
+ ( CASE  PostCount  WHEN  PostCount  >   10000   THEN   1   ELSE   0   END -- 帖子数条件
+ ( CASE  CreateTime  WHEN  CreateTime  <   20070101   THEN   1   ELSE   0   END -- 时间条件
=   3

如果上面的三个表达式加起来值是3就说明恰好满足三个条件,如果是两个条件就是等于2,如果扩展为n个条件m个条件成立也很容易写,很容易维护、修改。 

这是一个sql条件语句的技巧,希望对你有用。

本文假设的场景纯属虚设,请勿遐想。J

 

非常感谢韦恩卑鄙 在回复中提出了一种非常好的用法,可以给每个条件加上不同的优先级排序,代码如下:
SELECT   *   FROM   GROUP   WHERE  (
CASE  a  WHEN  a > 0   THEN   1000   ELSE   0   END   +  
CASE  b  WHEN  b > 0   THEN   100   ELSE   0   END   +  
CASE  c  WHEN  C > 0   THEN   10   ELSE   0   END   +  
CASE  d  WHEN  d > 0   THEN   1   ELSE   0   END  
>   101
ORDER   BY  (
CASE  a  WHEN  a > 0   THEN   1000   ELSE   0   END   +  
CASE  b  WHEN  b > 0   THEN   100   ELSE   0   END   +  
CASE  c  WHEN  C > 0   THEN   10   ELSE   0   END   +  
CASE  d  WHEN  d > 0   THEN   1   ELSE   0   END  )
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值