程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> sql中case語句的用法淺談

sql中case語句的用法淺談

編輯:MSSQL

sql中case語句的用法淺談。本站提示廣大學習愛好者:(sql中case語句的用法淺談)文章只能為提供參考,不一定能成為您想要的結果。以下是sql中case語句的用法淺談正文


SQL中Case的應用辦法

Case具有兩種格局。簡略Case函數和Case搜刮函數。

--簡略Case函數

CASE sex

         WHEN '1' THEN '男'

         WHEN '2' THEN '女'

ELSE '其他' END

--Case搜刮函數

CASE WHEN sex = '1' THEN '男'

         WHEN sex = '2' THEN '女'

ELSE '其他' END

這兩種方法,可以完成雷同的功效。簡略Case函數的寫法絕對比擬簡練,然則和Case搜刮函數比擬,功效方面會有些限制,好比寫斷定式。

還有一個須要留意的成績,Case函數只前往第一個相符前提的值,剩下的Case部門將會被主動疏忽。

--好比說,上面這段SQL,你永久沒法獲得“第二類”這個成果

CASE WHEN col_1 IN ( 'a', 'b') THEN '第一類'

         WHEN col_1 IN ('a')       THEN '第二類'

ELSE'其他' END

上面我們來看一下,應用Case函數都能做些甚麼工作。

一,已知數據依照別的一種方法停止分組,剖析。

有以下數據:(為了看得更清晰,我並沒有應用國度代碼,而是直接用國度名作為Primary Key)

國度(country)生齒(population)

中國600

美國100

加拿年夜100

英國200

法國300

日本250

德國200

墨西哥50

印度250

依據這個國度生齒數據,統計亞洲和北美洲的生齒數目。應當獲得上面這個成果。

洲生齒

亞洲1100

北美洲250

其他700

想要處理這個成績,你會怎樣做?生成一個帶有洲Code的View,是一個處理辦法,然則如許很難靜態的轉變統計的方法。

假如應用Case函數,SQL代碼以下:

SELECT  SUM(population),

        CASE country

                WHEN '中國'     THEN '亞洲'

                WHEN '印度'     THEN '亞洲'

                WHEN '日本'     THEN '亞洲'

                WHEN '美國'     THEN '北美洲'

                WHEN '加拿年夜'  THEN '北美洲'

                WHEN '墨西哥'  THEN '北美洲'

        ELSE '其他' END

FROM    Table_A

GROUP BY CASE country

                WHEN '中國'     THEN '亞洲'

                WHEN '印度'     THEN '亞洲'

                WHEN '日本'     THEN '亞洲'

                WHEN '美國'     THEN '北美洲'

                WHEN '加拿年夜'  THEN '北美洲'

                WHEN '墨西哥'  THEN '北美洲'

        ELSE '其他' END;

異樣的,我們也能夠用這個辦法來斷定工資的品級,並統計每品級的人數。SQL代碼以下;

SELECT

        CASE WHEN salary <= 500 THEN '1'

             WHEN salary > 500 AND salary <= 600  THEN '2'

             WHEN salary > 600 AND salary <= 800  THEN '3'

             WHEN salary > 800 AND salary <= 1000 THEN '4'

        ELSE NULL END salary_class,

        COUNT(*)

FROM    Table_A

GROUP BY

        CASE WHEN salary <= 500 THEN '1'

             WHEN salary > 500 AND salary <= 600  THEN '2'

             WHEN salary > 600 AND salary <= 800  THEN '3'

             WHEN salary > 800 AND salary <= 1000 THEN '4'

        ELSE NULL END;

二,用一個SQL語句完成分歧前提的分組。

有以下數據

國度(country)性別(sex)生齒(population)

中國1 340

中國2 260

美國1 45

美國2 55

加拿年夜1 51

加拿年夜2 49

英國1 40

英國2 60

依照國度和性別停止分組,得出成果以下

國度男女

中國340 260

美國45 55

加拿年夜51 49

英國40 60

通俗情形下,用UNION也能夠完成用一條語句停止查詢。然則那樣增長消費(兩個Select部門),並且SQL語句會比擬長。

上面是一個是用Case函數來完成這個功效的例子

SELECT country,

       SUM( CASE WHEN sex = '1' THEN

                      population ELSE 0 END),  --男性生齒

       SUM( CASE WHEN sex = '2' THEN

                      population ELSE 0 END)   --女性生齒

FROM  Table_A

GROUP BY country;


如許我們應用Select,完成對二維表的輸入情勢,充足顯示了Case函數的壯大。

三,在Check中應用Case函數。

在Check中應用Case函數在許多情形下都長短常不錯的處理辦法。能夠有許多人基本就不消Check,那末我建議你在看過上面的例子以後也測驗考試一下在SQL中應用Check。

上面我們來舉個例子

公司A,這個公司有個劃定,女人員的工資必需高於塊。假如用Check和Case來表示的話,以下所示

CONSTRAINT check_salary CHECK

           ( CASE WHEN sex = '2'

                  THEN CASE WHEN salary > 1000

                        THEN 1 ELSE 0 END

                  ELSE 1 END = 1 )

假如純真應用Check,以下所示

CONSTRAINT check_salary CHECK

           ( sex = '2' AND salary > 1000 )


女人員的前提卻是相符了,男人員就沒法輸出了。

四,依據前提有選擇的UPDATE。

例,有以下更新前提

工資以上的人員,工資削減%

工資在到之間的人員,工資增長%

很輕易斟酌的是選擇履行兩次UPDATE語句,以下所示

--前提

UPDATE Personnel

SET salary = salary * 0.9

WHERE salary >= 5000;

--前提

UPDATE Personnel

SET salary = salary * 1.15

WHERE salary >= 2000 AND salary < 4600;

然則工作沒有想象得那末簡略,假定有小我工資塊。起首,依照前提,工資削減%,釀成工資。接上去運轉第二個SQL時刻,由於這小我的工資是在到的規模以內,需增長%,最初這小我的工資成果是,不只沒有削減,反而增長了。假如如果反過去履行,那末工資的人相反會釀成削減工資。暫且不論這個規章是何等荒謬,假如想要一個SQL 語句完成這個功效的話,我們須要用到Case函數。代碼以下:

UPDATE Personnel

SET salary = CASE WHEN salary >= 5000

            THEN salary * 0.9

WHEN salary >= 2000 AND salary < 4600

THEN salary * 1.15

ELSE salary END;

這裡要留意一點,最初一行的ELSE salary是必須的,如果沒有這行,不相符這兩個前提的人的工資將會被寫成NUll,那可就年夜事不妙了。在Case函數中Else部門的默許值是NULL,這點是須要留意的處所。

這類辦法還可以在許多處所應用,好比說變革主鍵這類累活。

普通情形下,要想把兩條數據的Primary key,a和b交流,須要經由暫時存儲,拷貝,讀回數據的三個進程,如果應用Case函數的話,一切都變得簡略多了。

p_key col_1 col_2

a 1 張三

b 2 李四

c 3 王五

假定有如上數據,須要把主鍵a和b互相交流。用Case函數來完成的話,代碼以下

UPDATE SomeTable

SET p_key = CASE WHEN p_key = 'a'

THEN 'b'

WHEN p_key = 'b'

THEN 'a'

ELSE p_key END

WHERE p_key IN ('a', 'b');

異樣的也能夠交流兩個Unique key。須要留意的是,假如有須要交流主鍵的情形產生,多半是現在對這個表的設計停止得不敷到位,建議檢討表的設計能否妥善。

五,兩個表數據能否分歧的檢討。

Case函數分歧於DECODE函數。在Case函數中,可使用BETWEEN,LIKE,IS NULL,IN,EXISTS等等。好比說應用IN,EXISTS,可以停止子查詢,從而完成更多的功效。

上面具個例子來講明,有兩個表,tbl_A,tbl_B,兩個表中都有keyCol列。如今我們對兩個表停止比擬,tbl_A中的keyCol列的數據假如在tbl_B的keyCol列的數據中可以找到,前往成果'Matched',假如沒有找到,前往成果'Unmatched'。

要完成上面這個功效,可使用上面兩條語句

--應用IN的時刻

SELECT keyCol,

CASE WHEN keyCol IN ( SELECT keyCol FROM tbl_B )

THEN 'Matched'

ELSE 'Unmatched' END Label

FROM tbl_A;

--應用EXISTS的時刻

SELECT keyCol,

CASE WHEN EXISTS ( SELECT * FROM tbl_B

WHERE tbl_A.keyCol = tbl_B.keyCol )

THEN 'Matched'

ELSE 'Unmatched' END Label

FROM tbl_A;

應用IN和EXISTS的成果是雷同的。也能夠應用NOT IN和NOT EXISTS,然則這個時刻要留意NULL的情形。

六,在Case函數中應用算計函數

假定有上面一個表

學號(std_id) 課程ID(class_id) 課程名(class_name) 主修flag(main_class_flg)

100 1 經濟學Y

100 2 汗青學N

200 2 汗青學N

200 3 考古學Y

200 4 盤算機N

300 4 盤算機N

400 5 化學N

500 6 數學N

有的先生選擇了同時修幾門課程(100,200)也有的先生只選擇了一門課程(300,400,500)。選修多門課程的先生,要選擇一門課程作為主修,主修flag外面寫入Y。只選擇一門課程的先生,主修flag為N(現實上如果寫入Y的話,就沒有上面的費事事了,為了舉例子,還請多多包括)。

如今我們要依照上面兩個前提對這個表停止查詢

只選修一門課程的人,前往那門課程的ID

選修多門課程的人,前往所選的主課程ID

簡略的設法主意就是,履行兩條分歧的SQL語句停止查詢。

前提

--前提:只選擇了一門課程的先生

SELECT std_id, MAX(class_id) AS main_class

FROM Studentclass

GROUP BY std_id

HAVING COUNT(*) = 1;

履行成果

STD_ID   MAIN_class

------   ----------

300      4

400      5

500      6

前提

--前提:選擇多門課程的先生

SELECT std_id, class_id AS main_class

FROM Studentclass

WHERE main_class_flg = 'Y' ;

履行成果

STD_ID  MAIN_class

------  ----------

100     1

200     3

假如應用Case函數,我們只需一條SQL語句便可以處理成績,詳細以下所示

SELECT  std_id,

CASE WHEN COUNT(*) = 1  --只選擇一門課程的先生的情形

THEN MAX(class_id)

ELSE MAX(CASE WHEN main_class_flg = 'Y'

THEN class_id

ELSE NULL END

)

END AS main_class

FROM Studentclass

GROUP BY std_id;

運轉成果

STD_ID   MAIN_class

------   ----------

100      1

200      3

300      4

400      5

500      6

經由過程在Case函數中嵌套Case函數,在算計函數中應用Case函數等辦法,我們可以輕松的處理這個成績。應用Case函數給我們帶來了更年夜的自在度。

最初提示一下應用Case函數的老手留意不要犯上面的毛病

CASE col_1

WHEN 1       THEN 'Right'

WHEN NULL  THEN 'Wrong'

END

在這個語句中When Null這一行老是前往unknown,所以永久不會湧現Wrong的情形。由於這句可以調換成WHEN col_1 = NULL,這是一個毛病的用法,這個時刻我們應當選擇用WHEN col_1 IS NULL。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved