专注WEB开发 分享经验,沉淀知识

sql case when 用法实例剖析

 作者:chenxing  时间:2017-05-25 11:37  评论:

很多人都说不要把sql只当作查询语句而要把它当作一门语言来看待。那么语言最大的一个特性就要有逻辑结构,比如条件结构(if)。通用sql也有这样的结构,** case when ** 就是其中之一。

很多人都说不要把sql只当作查询语句而要把它当作一门语言来看待。那么语言最大的一个特性就要有逻辑结构,比如条件结构(if)。通用sql也有这样的结构, case when 就是其中之一。

case when 如何用呢,完整的关键词是:case when then else end。

有两种表达方式:

1.条件是一个具体的值。


CASE field  WHEN value THEN result1 ELESE result2 END;

CASE field  
    WHEN value THEN result1
    WHEN value THEN result2
    ELESE result3
END;

2.条件作为一个表达式存在。

CASE WHEN expression THEN result1 ELESE result2 END;

CASE 
    WHEN expression1 THEN result1
    WHEN expression2 THEN result2
    ELESE result3
END;

这里的else关键词不算必需的。

对于case when 看我是怎么在项目中应用的?

应用场景:

一个推广人员(有两级,高级推广人和子推广人)的交易表分成表。推广人交易一笔会拿到相应的提成(字段basic_withdrawable),如果是子推广人推广除了自己拿到提成外,ta的高级推广人也会拿到相对比例的提成。现在有一个需求查看某一个推广人的分成信息。

表数据如下:

transasctions表

根据需求我们知道分成来自两个方面,一个作为高级推广人其子推广人贡献的提成,一个自身做为一个推广人交易的提成。那查询的结果为:

结果表1

从上面结果看如果没加上推广人id字段是很难区分哪一个我的提成的,而且没有必要区分二者提成。接下来要做的事儿就是把自身推广提成和子推广提成并成一列。

case when 就派上用场了,使用下面sql:

select id, order_id, 
    case 
        when super_promoter_id = 5 then super_withdrawable 
        when basic_promoter_id = 5 then basic_withdrawable 
    end as withdrawable 
from transactions where super_promoter_id = 5 or basic_promoter_id = 5;

结果如下:

case when 结果表

结果是不是清晰明了符合需求了?

总结上面的实例, where 查询可以对行进行过滤,case when 查询在字段中的应用可以对列进行过滤 。这样行过滤和列过滤的结合可以写出非常漂亮的sql语句。

除特别注明外,本站所有文章均为作者原创。 或分享自己的编程经验,或探讨工作中的问题,或聊以人生趣事。 转载请注明出处来自 http://www.qiusuoweb.com/44.html

发布评论

 提交评论
有人回复时邮件通知我

 评论(0)

站长头像
chenxing(PHP攻城狮)

运营天数

总访问量

文章数量

-

-

-

交流群:157451741

新浪微博:草莽兴

 近期文章

Mac目录如何快速返回上一级?

 2022-07-21 17:27  25

Mac目录和终端如何快速切换

 2022-07-21 17:11  7

phpstorm一个窗口打开多个项目?

 2022-07-20 17:15  14

 最新评论

 诚心: 09月29日 23:01
学到了
来源: 如何一次性推送百万级别的消息
 Nick: 04月14日 12:26
网上的资料还是太老,都只是取一个元素,解决了一大难题
来源: redis set集合取出一组数据并删除
 skywalker: 11月03日 18:21
简洁明了
来源: mysql 获取某个日期的前一天或后一天
 lisheng: 05月09日 19:26
兴哥牛B加油哈兴哥成功的道路上你又进了一步 哈哈
来源: 一年时间又回到这里
 心态炸裂: 03月24日 10:54
No3.blindcomfirm 多了一个l,望改正!!!
来源: 微信小程序获取input值的总结
 666666: 11月08日 13:49
66666
来源: 一年时间又回到这里