1. 程式人生 > >sql之case when用法詳解

sql之case when用法詳解

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

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

簡單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輸出結果。

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

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

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

 


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

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

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

當能耗值小於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聚合函式

相關推薦

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

sqlcase when用法

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

SQLcase when then用法(用於分類統計)

char purge 格式 但是 統計 spa 比較 log 永遠 ase具有兩種格式。簡單case函數和case搜索函數。 --簡單case函數 case sex when ‘1‘ then ‘男‘ when ‘2‘ then ‘女’

SQLcase when then用法

case具有兩種格式:                              簡單case函式;                             case搜尋函式; --簡單case函式 case sex when '1' then '男' when

SQL語句GROUP BY用法

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

【統計】SQLcase when then else end用法(用於分類統計)(一)

case具有兩種格式。簡單case函式和case搜尋函式。--簡單case函式 case sex when '1' then '男' when '2' then '女’ else '其他' end --case搜尋函式 case when sex = '1' th

SQLcase when

參考 技術分享 搜索 fec country nbsp lec center then 大致學習了下SQL的功能語句,case when 類似於c語言中的switich case語句,多分支選擇,不同的值可以有不同的返回量。比如,在一個包含了sex字段的表中,可能的值為1、

C# static的用法

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

linuxselect函式用法

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

Pythonformat的用法

format函式 它增強了字串格式化的功能。基本語法是通過 {} 和 : 來代替以前的 % 。format 函式可以接受不限個引數,位置可以不按順序。 **例一:**format 函式可以接受不限個引數,位置可以不按順序。 "{} {}".format(

SQL Server Check 約束用法

一、定義:        CHECK 約束用於限制列中的值的範圍。        如果對單個列定義 CHECK 約束,那麼該列只允許特定的值。        如果對一個表定義 CHECK 約束,那麼此約束會在特定的列中對值進行限制。 做資料庫,就必須要會寫約束。 運算

oracle 的 sql 語句 case when 用法

示例 with tab1 as     (select              case                   when  (count(su.insu_pkg_id)>0) then 2                   else 0

oraclecase when then else end用法

闡述 case when then else end 可以理解為java的if-else if -else。是流程控制語句或者條件控制語句,可以自定義邏輯 使用場景 對已知的資料進行邏輯分組或者進

Case When Else End用法

更新資料 update table set 欄位1=case when 條件1 then 值1 when 條件2 then 值2 else 值3 end where …… 查詢資料

sql語句exists/not exists用法

1、Student: Sno Sname Ssex Sage Sdept 200215121 李勇 男 20 CS 200215122 劉晨 女 19 CS 200215123 王敏 女 18 M

boost::algorithm用法字符串關系判斷

ret 判斷 hello 第一個字符 pri 字符串替換 views .net private http://blog.csdn.net/qingzai_/article/details/44417937 下面先列舉幾個常用的: #define i_end_with boo

(轉)Linux命令Ethtool用法

如果 size ram phy 基本設置 速度 終端 網卡驅動 sed Linux命令之Ethtool用法詳解 原文:http://www.linuxidc.com/Linux/2012-01/52669.htm Linux/Unix命令之Ethtool描述:Eth

1.12-linux三劍客awk用法

-a proc == 行號 oss url oldboyedu rap oai 1.12linux三劍客之awk用法詳解內容:1. awk執行過程2. awk命令格式3. awk用法4. awk數組第1章 awk執行過程 一直讀取到文件的最後一行第2章 awk ‘找誰{幹啥

SQL Server的case when用法

cas class bubuko person sql bsp as2 case identity 1.簡單sql一例 SELECT top 10 CASE WHEN IDENTITY_ID=‘1‘ THEN ‘管理員‘ WHEN IDENTITY_ID=‘5‘

linux進程間通信Posix共享內存用法及代碼舉例

函數 ini 復制代碼 define 進程 a.out IV 使用 init Posix共享內存有兩種非親緣進程間的共享內存方法:1). 使用內存映射文件,由open函數打開,再由mmap函數把返回的文件描述符映射到當前進程空間中的一個文件。2). 使用共享內存區對象,由