<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
CASE 表示式分為簡單表示式與搜尋表示式,其中搜尋表示式可以覆蓋簡單表示式的全部能力,我也建議只寫搜尋表示式,而不要寫簡單表示式。
簡單表示式:
SELECT CASE city WHEN '北京' THEN 1 WHEN '天津' THEN 2 ELSE 0 END AS abc FROM test
搜尋表示式:
SELECT CASE WHEN city = '北京' THEN 1 WHEN city = '天津' THEN 2 ELSE 0 END AS abc FROM test
明顯可以看出,簡單表示式只是搜尋表示式 a = b
的特例,因為無法書寫任何符號,只要條件換成 a > b
就無法勝任了,而搜尋表示式不但可以輕鬆勝任,甚至可以寫聚合函數。
為什麼 CASE 表示式裡可以寫聚合函數?
因為本身表示式就支援聚合函數,比如下面的語法,我們不會覺得奇怪:
SELECT sum(pv), avg(uv) from test
本身 SQL 就支援多種不同的聚合方式同時計算,所以將其用在 CASE 表示式裡,也是順其自然的:
SELECT CASE WHEN count(city) = 100 THEN 1 WHEN sum(dau) > 200 THEN 2 ELSE 0 END AS abc FROM test
只要 SQL 表示式中存在聚合函數,那麼整個表示式都聚合了,此時存取非聚合變數沒有任何意義。所以上面的例子,即便在 CASE 表示式中使用了聚合,其實也不過是聚合了一次後,按照條件進行判斷罷了。
這個特性可以解決很多實際問題,比如將一些複雜聚合判斷條件的結果用 SQL 結構輸出,那麼很可能是下面這種寫法:
SELECT CASE WHEN 聚合函數(欄位) 符合什麼條件 THEN xxx ... 可能有 N 個 ELSE NULL END AS abc FROM test
這也可以認為是一種行轉列的過程,即 把行聚合後的結果通過一條條 CASE 表示式形成一個個新的列。
我們希望利用 CASE 表示式找出那些 pv 大於平均值的行,以下這種想當然的寫法是錯誤的:
SELECT CASE WHEN pv > avg(pv) THEN 'yes' ELSE 'no' END AS abc FROM test
原因是,只要 SQL 中存在聚合表示式,那麼整條 SQL 就都是聚合的,所以返回的結果只有一條,而我們期望查詢結果不聚合,只是判斷條件用到了聚合結果,那麼就要使用子查詢。
為什麼子查詢可以解決問題?因為子查詢的聚合發生在子查詢,而不影響當前父查詢,理解了這一點,就知道為什麼下面的寫法才是正確的了:
SELECT CASE WHEN pv > ( SELECT avg(pv) from test ) THEN 'yes' ELSE 'no' END AS abc FROM test
這個例子也說明了 CASE 表示式裡可以使用子查詢,因為子查詢是先計算的,所以查詢結果在哪兒都能用,CASE 表示式也不例外。
WHERE 後面也可以跟 CASE 表示式的,用來做一些需要特殊列舉處理的篩選。
比如下面的例子:
SELECT * FROM demo WHERE CASE WHEN city = '北京' THEN true ELSE ID > 5 END
本來我們要查詢 ID 大於 5 的資料,但我想對北京這個城市特別對待,那麼就可以在判斷條件中再進行 CASE 分支判斷。
這個場景在 BI 工具裡等價於,建立一個 CASE 表示式欄位,可以拖入篩選條件生效。
想不到吧,GROUP BY 裡都可以寫 CASE 表示式:
SELECT isPower, sum(gdp) FROM test GROUP BY CASE WHEN isPower = 1 THEN city, area ELSE city END
上面例子表示,計算 GDP 時,對於非常發達的城市,按照每個區粒度檢視聚合結果,也就是看的粒度更細一些,而對於欠發達地區,本身 gdp 也不高,直接按照城市粒度看聚合結果。
這樣,就按照不同的條件對資料進行了分組聚合。由於返回行結果是混在一起的,像這個例子,可以根據 isPower 欄位是否為 1 判斷,是否按照城市、區域進行了聚合,如果沒有其他更顯著的標識,可能導致無法區分不同行的聚合粒度,因此謹慎使用。
同樣,ORDER BY 使用 CASE 表示式,會將排序結果按照 CASE 分類進行分組,每組按照自己的規則排序,比如:
SELECT * FROM test ORDER BY CASE WHEN isPower = 1 THEN gdp ELSE people END
上面的例子,對發達地區採用 gdp 排序,否則採用人口數量排序。
CASE 表示式總結一下有如下特點:
到此這篇關於SQL CASE 表示式的具體使用的文章就介紹到這了,更多相關SQL CASE 表示式內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45