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