1. 程式人生 > >SQL之CASE WHEN用法詳解(CASE WHEN使用總結)

SQL之CASE WHEN用法詳解(CASE WHEN使用總結)

簡單CASE WHEN函式:

CASE SCORE WHEN 'A' THEN '優' ELSE '不及格' END
CASE SCORE WHEN 'B' THEN '良' ELSE '不及格' END
CASE SCORE WHEN 'C' THEN '中' ELSE '不及格' END

 等同於,使用CASE WHEN條件表示式函式實現:

CASE WHEN SCORE = 'A' THEN '優'
     WHEN SCORE = 'B' THEN '良'
     WHEN SCORE = 'C' THEN '中' ELSE '不及格' END

 THEN後邊的值與ELSE後邊的值型別應一致,否則會報錯

。如下:

CASE SCORE WHEN 'A' THEN '優' ELSE 0 END

'優'和0資料型別不一致則報錯: 

[Err] ORA-00932: 資料型別不一致: 應為 CHAR, 但卻獲得 NUMBER

簡單CASE WHEN函式只能應對一些簡單的業務場景,而CASE WHEN條件表示式的寫法則更加靈活。

CASE WHEN條件表示式函式:類似JAVA中的IF ELSE語句。

格式

CASE WHEN condition THEN result

[WHEN...THEN...]

ELSE result

END

condition是一個返回布林型別的表示式,如果表示式返回true,則整個函式返回相應result的值,如果表示式皆為false,則返回ElSE後result的值,如果省略了ELSE子句,則返回NULL

下面介紹幾種常用場景。

場景1:有分數score,score<60返回不及格,score>=60返回及格,score>=80返回優秀

SELECT
    STUDENT_NAME,
    (CASE WHEN score < 60 THEN '不及格'
        WHEN score >= 60 AND score < 80 THEN '及格'
        WHEN score >= 80 THEN '優秀'
        ELSE '異常' END) AS REMARK
FROM
    TABLE

 注意:如果你想判斷score是否null

的情況,WHEN score = null THEN '缺席考試',這是一種錯誤的寫法,正確的寫法應為:

CASE WHEN score IS NULL THEN '缺席考試' ELSE '正常' END

場景2:現老師要統計班中,有多少男同學,多少女同學,並統計男同學中有幾人及格,女同學中有幾人及格,要求用一個SQL輸出結果。

表結構如下:其中STU_SEX欄位,0表示男生,1表示女生。

STU_CODE STU_NAME STU_SEX STU_SCORE
XM 小明 0 88
XL 小磊 0 55
XF 小峰 0 45
XH 小紅 1 66
XN 曉妮 1 77
XY 小伊 1 99
SELECT 
	SUM (CASE WHEN STU_SEX = 0 THEN 1 ELSE 0 END) AS MALE_COUNT,
	SUM (CASE WHEN STU_SEX = 1 THEN 1 ELSE 0 END) AS FEMALE_COUNT,
	SUM (CASE WHEN STU_SCORE >= 60 AND STU_SEX = 0 THEN 1 ELSE 0 END) AS MALE_PASS,
	SUM (CASE WHEN STU_SCORE >= 60 AND STU_SEX = 1 THEN 1 ELSE 0 END) AS FEMALE_PASS
FROM 
	THTF_STUDENTS

輸出結果如下:

MALE_COUNT FEMALE_COUNT MALE_PASS FEMALE_PASS
3 3 1 3

場景3:經典行轉列,並配合聚合函式做統計

現要求統計各個城市,總共使用了多少水耗、電耗、熱耗,使用一條SQL語句輸出結果

有能耗表如下:其中,E_TYPE表示能耗型別,0表示水耗,1表示電耗,2表示熱耗

E_CODE E_VALUE  E_TYPE
北京 28.50 0
北京 23.51 1
北京 28.12 2
北京 12.30 0
北京 15.46 1
上海 18.88 0
上海 16.66 1
上海 19.99 0
上海 10.05 0
SELECT 
	E_CODE,
	SUM(CASE WHEN E_TYPE = 0 THEN E_VALUE ELSE 0 END) AS WATER_ENERGY,--水耗
	SUM(CASE WHEN E_TYPE = 1 THEN E_VALUE ELSE 0 END) AS ELE_ENERGY,--電耗
	SUM(CASE WHEN E_TYPE = 2 THEN E_VALUE ELSE 0 END) AS HEAT_ENERGY--熱耗
FROM 
	THTF_ENERGY_TEST
GROUP BY
	E_CODE

 輸出結果如下:

E_CODE WATER_ENERGY ELE_ENERGY HEAT_ENERGY
北京 40.80 38.97 28.12
上海 48.92 16.66 0

場景4:CASE WHEN中使用子查詢

根據城市用電量多少,計算用電成本。假設電能耗單價分為三檔,根據不同的能耗值,使用相應價格計算成本。

 價格表如下:

P_PRICE P_LEVEL P_LIMIT
1.20 0 10
1.70 1 30
2.50 2 50

當能耗值小於10時,使用P_LEVEL=0時的P_PRICE的值,能耗值大於10小於30使用P_LEVEL=1時的P_PRICE的值...

CASE WHEN energy <= (SELECT P_LIMIT FROM TABLE_PRICE WHERE P_LEVEL = 0) THEN (SELECT P_PRICE FROM TABLE_PRICE WHERE P_LEVEL = 0)
    WHEN energy > (SELECT P_LIMIT FROM TABLE_PRICE WHERE P_LEVEL = 0) AND energy <= (SELECT P_LIMIT FROM TABLE_PRICE WHERE P_LEVEL = 1) THEN (SELECT P_PRICE FROM TABLE_PRICE WHERE P_LEVEL = 1)
    WHEN energy > (SELECT P_LIMIT FROM TABLE_PRICE WHERE P_LEVEL = 1) AND energy <= (SELECT P_LIMIT FROM TABLE_PRICE WHERE P_LEVEL = 2) THEN (SELECT P_PRICE FROM TABLE_PRICE WHERE P_LEVEL = 2)

 場景5:結合max聚合函式

CASE WHEN 函式使用起來簡單易懂,此篇文章只作了簡單的使用介紹,還需在實際工作中根據業務場景不同來靈活使用。

相關推薦

SQLCASE WHEN用法CASE WHEN使用總結

簡單CASE WHEN函式: CASE SCORE WHEN 'A' THEN '優' ELSE '不及格' END CASE SCORE WHEN 'B' THEN '良' ELSE '不及格' END CASE SCORE WHEN 'C' THEN '中' ELSE

C/C++ typedef用法真的很詳細

是p2++出錯了。這個問題再一次提醒我們:typedef和#define不同,它不是簡單的文字替換。上述程式碼中const pStr p2並不等於const char * p2。const pStr p2和const long x本質上沒有區別,都是對變數進行只讀限制,只不過此處變數p2的資料型別是我們自

sqlcase when用法

簡單CASE WHEN函式只能應對一些簡單的業務場景,而CASE WHEN條件表示式的寫法則更加靈活。 CASE WHEN條件表

SQL語句GROUP BY用法

大家都知道groupby在sql語句中代表按照某個欄位分組,但原理和用法在網上不容易查得到。 下面我用一句話簡介的來說明: 如果select 中出現了非聚合函式的欄位,那麼所有欄位都要在group by後面出現,然而group by後面的分組欄位可以不用在select中出

PL/SQL DEVELOPER 基本用法

PL/SQL DEVELOPER 基本用法詳解(建議寫過第一個儲存過程後的初手必讀)   用過oracle的都抱怨,為了穩定 它提供的圖形化操作 速度慢的讓人傷心呀,p4+128M的機器只要啟動一個   oracle服務就夠讓人傷心的,再在dba studio裡面操作真能讓人

C# ListView用法

分組 創建 cti 排列 checkbox 定義 com 程序 erl 一、ListView類 1、常用的基本屬性: (1)FullRowSelect:設置是否行選擇模式。(默認為false) 提示:只有在Details視圖該屬性才有

Redis集群配置文件待完善

enable ice local ise bare config 停止 databases end 運維Redis集群的核心任務就是配置文件Redis.conf 命令行將現使用的Redis配置參數導出到 redis.conf.bak文件 grep ‘^[^#]‘ /etc

Windows滲透利器Pentest BOX使用

內存 標簽 配置 ram 添加 概覽 測試環境 功能 ruby 內容概覽: 知識科普 優缺點總結 功能參數詳解翻譯: 控制臺參

SQL Server 表的管理_關於表的操作增刪查改的操作的案例代碼

har table 詳解 增刪 .com ble tab SQ eat SQL Server 表的管理_關於表的操作增刪查改的操作的詳解(案例代碼) 概述: 表由行和列組成,每個表都必須有個表名。 SQL CREATE TABLE 語法 CREATE T

嵌套表用法PLSQL

delete into val 技術分享 技術 oracl 表數據 ubd pri 嵌套表嵌套表是一種類似於索引表的結構,也可以用於保存多個數據,而且也可以保存復合類型的數據嵌套表指的是一個數據表定義事同時加入了其他內部表的定義,這一概念是在oracle 8中引入的,它們可

C# static的用法

c const 一次 訪問 分配 focus rgs 改變 class 數據 一、靜態類   靜態類與非靜態類的重要區別在於靜態類不能實例化,也就是說,不能使用 new 關鍵字創建靜態類類型的變量。在聲明一個類時使用static關鍵字,具有兩個方面的意義:首先,它防止程序員

ROW_NUMBER() OVER()函式用法 分組排序 例子多

語法格式:row_number() over(partition by 分組列 order by 排序列 desc) row_number() over()分組排序功能: 在使用 row_number() over()函式時候,over()裡頭的分組以及排序的執行晚於 wher

linuxselect函式用法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

linux中mariadb基本用法企業級

資料庫 表的每一個列名字的頭   叫做欄位 是高階的exel表格軟體 資料庫種類 sqlserver  sqllite  db2   oracle  > mysql   比較多   其中my

梳理Python 框架中介軟體用途和機制

什麼是中介軟體? 中介軟體是一個Python程式設計師用來處理Django的請求和響應的框架級別的鉤子,它是一個輕量,低級別的外掛系統,用於全域性範圍內改變Django的輸入,輸出。每個中介軟體元件都負責做一些特定的功能。 說的直白一點是中介軟體就是幫我們程式設計

erlang lists 系列函式功能與用法共68個函式

  一,帶函式Pred1, all(Pred, List) -> boolean()如果List中的每個元素作為Pred函式的引數執行,結果都返回true,那麼all函式返回true, 否則返回false 例子: lists:all(fun(E) -> true e

Linq旅:Linq入門Linq to Objects

本博文詳細介紹 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,語言整合查詢)。通過LINQ,我們可以使用相同API操作不同的資料來源。接下來就讓我們看看LINQ是什麼以及如何使用? 再此之前,需要先了解的相關技術 1.隱式型別、匿名型別、

Boost.Lambda 用法

與其它許多 Boost 庫一樣,這個庫完全定義在標頭檔案中,這意味著你不必構建任何東西就可以開始使用。但是,知道一點關於 lambda 表示式的東西肯定是有幫助的。接下來的章節會帶你瀏覽一下這個庫,還包括如何在 lambda 表示式中進行異常處理!這個庫非常廣泛,前面還有很

Extjs GridPanel用法單元格點選事件

Extjs GridPanel 提供了非常強大資料表格功能,在GridPanel可以展示資料列表,可以對資料列表進行選擇、編輯等。在之前的Extjs MVC開發模式詳解中,我們已經使用到了GridPanel,今天我們來介紹一下Extjs中GridPanel的詳細

史上最簡單MySQL教程進階篇儲存引擎介紹及預設引擎設定

什麼是儲存引擎? 與其他資料庫例如Oracle 和SQL Server等資料庫中只有一種儲存引擎不同的是,MySQL有一個被稱為“Pluggable Storage Engine Architecture”(可替換儲存引擎架構)的特性,也就意味著My