Re: [SQL ] 請教這個問題如何下SQL呢?

看板Database (資料庫)作者 (全職業封頂路途漫長)時間18年前 (2006/06/26 09:38), 編輯推噓2(200)
留言2則, 2人參與, 最新討論串12/13 (看更多)
※ 引述《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

06/26 11:18, , 1F
口烏~~~~ [含淚筆記ing]
06/26 11:18, 1F

06/26 12:05, , 2F
筆記ing
06/26 12:05, 2F
文章代碼(AID): #14dpgfS_ (Database)
討論串 (同標題文章)
文章代碼(AID): #14dpgfS_ (Database)