Database 板


LINE

※ 引述《weisor (无所事事)》之铭言: : ※ 引述《ylk (YLK)》之铭言: : : 谢谢您的指导。 : : 想请问您,您的环境是? case 这个栏位代表的意思是? : case statement : mysql, postgres, db2, mssql 都有支援 : 请参考 : http://msdn2.microsoft.com/zh-tw/library/ms181765.aspx : http://www.postgresql.org/docs/8.1/interactive/functions-conditional.html : http://publib.boulder.ibm.com/infocenter/db2luw/v8/ : topic/com.ibm.db2.udb.doc/admin/r0005646.htm : http://dev.mysql.com/doc/refman/5.1/en/case-statement.html 我只用过 Oracle , @@... 但其他的DB 应该是大同小异吧 最近刚好研究过 以下参考( 抄袭? :Q ) 自 Oracle Documentation Library 哪个版本开始有我不确定, 应该是 8i 以後版本开始支援 Case 与 Decode 很类似 , 但是提供更高的弹性与逻辑判断 Case 比 Decode 有更好的阅读性与 Performance 通常 , Case 很适用於 区间式的资料抓取 ... 如 年龄 : 20-29 , 30-39 ..etc The syntax is: CASE WHEN <cond1> THEN <v1> WHEN <cond2> THEN <v2> ... [ ELSE <vn+1> ] END You can specify only 255 arguments and each WHEN...THEN pair counts as two arguments. 简言之就是 CASE WHEN <cond1> 成立 传回 <v1> WHEN <cond2> 成立 传回 <v2> ... [ ELSE 全不成立 传回 <vn+1> ] END 参数最多 255个 ... (真写到 255 应该会很长一句吧? @@ ) 简单的 sample : 假设我们要找出一个公司的平均薪水 若某员工薪资低於 2000 则以 2000 代表 我们可能会写成 SELECT AVG( foo(e.sal) ) FROM emps e; foo() 是一个自行定义的 function , 逻辑如上所示 现在 我们可以用更简单的方式 ---- > 使用 CASE : SELECT AVG( CASE when e.sal > 2000 THEN e.sal ELSE 2000 end ) FROM emps e; 因为未使用 PL/SQL 所以 Performance 会好一点 . 另一种例子 : SELECT CASE WHEN age BETWEEN 70 AND 79 THEN '70-79' WHEN age BETWEEN 80 and 89 THEN '80-89' WHEN age BETWEEN 90 and 99 THEN '90-99' WHEN age > 99 THEN '100+' END) as age_group, COUNT(*) as age_count FROM customer GROUP BY CASE WHEN age BETWEEN 70 AND 79 THEN '70-79' WHEN age BETWEEN 80 and 89 THEN '80-89' WHEN age BETWEEN 90 and 99 THEN '90-99' WHEN age > 99 THEN '100+' END); output 会长得像这样 : age_group age_count --------- --------- 70-79 4 80-89 2 90-99 3 100+ 1 而上面这种例子如果不使用 Case , 通常会变这样... = = select '70-79' as age_group , count(*) age_count from customer where age BETWEEN 70 AND 79 union all select '80-89' as age_group , count(*) age_count from customer where age BETWEEN 80 AND 89 union all select '90-99' as age_group , count(*) age_count from customer where age BETWEEN 90 AND 99 union all select '100+' as age_group , count(*) age_count from customer where age > 99 这种方式会造成 , 一共需要跑 四次 customer 再把结果 union (或 union all ) 起来 performance 当然会比 使用 Case (最多只要跑一次Full Table Scan) 差很多 当资料在一两百万笔以下时当然没差, 到了 100,000,000 笔... 呜... 至於其他的应用,就靠各位的想像力噜... --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 202.145.230.2
1F:推 PsMonkey:口乌~~~~ [含泪笔记ing] 06/26 11:18
2F:推 NightPrince:笔记ing 06/26 12:05







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:WOW站内搜寻

TOP