Re: [SQL ] 請教這個問題如何下SQL呢?
看板Database (資料庫)作者ppanerai (全職業封頂路途漫長)時間18年前 (2006/06/26 09:38)推噓2(2推 0噓 0→)留言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
06/26 11:18, 1F
推
06/26 12:05, , 2F
06/26 12:05, 2F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 12 之 13 篇):
Database 近期熱門文章
PTT數位生活區 即時熱門文章