专注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语句。

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

发布评论

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

 评论(0)

站长头像
chenxing(PHP攻城狮)

运营天数

总访问量

文章数量

-

-

-

交流群:157451741

新浪微博:草莽兴

 近期文章

ssh 使用密钥登录

 2025-06-12 18:33  9

聊聊国产化

 2024-08-24 15:56  108

内网穿透工具frp配置详情

 2024-07-18 22:30  212

mac在终端复制出现乱码00~ *** 01~

 2024-07-16 20:38  47

php html生成图片

 2024-07-08 20:25  87

scp命令使用说明

 2024-07-06 12:14  123

 最新评论

 tradeOff: 08月30日 10:19
在某些领域国产化是一个迫不得已的事儿
来源: 聊聊国产化
 sue: 07月03日 10:24
可以
来源: 微信小程序如何获取单个input值
 流年: 07月02日 11:31
不错的尝试
来源: 博客系统如何用markdown编辑器发布文章
 诚心: 09月29日 23:01
学到了
来源: 如何一次性推送百万级别的消息
 Nick: 04月14日 12:26
网上的资料还是太老,都只是取一个元素,解决了一大难题
来源: redis set集合取出一组数据并删除
 skywalker: 11月03日 18:21
简洁明了
来源: mysql 获取某个日期的前一天或后一天