商務英語計算機英語

數據庫中case的用法

本文已影響 5.95K人 

數據庫中case的用法的用法你知道嗎?下面小編就跟你們詳細介紹下數據庫中case的用法的用法,希望對你們有用。

ing-bottom: 75%;">數據庫中case的用法

  數據庫中case的用法的用法如下:

沒有,用case when 來代替就行了.

例如,下面的語句顯示中文年月

select getdate() as 日期,case month(getdate())

when 11 then '十一'

when 12 then '十二'

else substring('一二三四五六七八九十', month(getdate()),1)

end+'月' as 月份

=================================================

CASE 可能是 SQL 中被誤用最多的關鍵字之一。雖然你可能以前用過這個關鍵字來創建字段,但是它還具有更多用法。例如,你可以在 WHERE 子句中使用 CASE。

首先讓我們看一下 CASE 的語法。在一般的 SELECT 中,其語法如下:

複製代碼

SELECT <myColumnSpec> =

CASE

WHEN <A> THEN <somethingA>

WHEN <B> THEN <somethingB>

ELSE <somethingE>

END

複製代碼

在上面的代碼中需要用具體的參數代替尖括號中的內容。下面是一個簡單的例子:

複製代碼

USE pubs

GO

SELECT

Title,

'Price Range' =

CASE

WHEN price IS NULL THEN 'Unpriced'

WHEN price < 10 THEN 'Bargain'

WHEN price BETWEEN 10 and 20 THEN 'Average'

ELSE 'Gift to impress relatives'

END

FROM titles

ORDER BY price

GO

複製代碼

這是 CASE 的典型用法,但是使用 CASE 其實可以做更多的事情。比方說下面的 GROUP BY 子句中的 CASE:

複製代碼

SELECT 'Number of Titles', Count(*)

FROM titles

GROUP BY

CASE

WHEN price IS NULL THEN 'Unpriced'

WHEN price < 10 THEN 'Bargain'

WHEN price BETWEEN 10 and 20 THEN 'Average'

ELSE 'Gift to impress relatives'

END

GO

複製代碼

你甚至還可以組合這些選項,添加一個 ORDER BY 子句,如下所示:

複製代碼

USE pubs

GO

SELECT

CASE

WHEN price IS NULL THEN 'Unpriced'

WHEN price < 10 THEN 'Bargain'

WHEN price BETWEEN 10 and 20 THEN 'Average'

ELSE 'Gift to impress relatives'

END AS Range,

Title

FROM titles

GROUP BY

CASE

WHEN price IS NULL THEN 'Unpriced'

WHEN price < 10 THEN 'Bargain'

WHEN price BETWEEN 10 and 20 THEN 'Average'

ELSE 'Gift to impress relatives'

END,

Title

ORDER BY

CASE

WHEN price IS NULL THEN 'Unpriced'

WHEN price < 10 THEN 'Bargain'

WHEN price BETWEEN 10 and 20 THEN 'Average'

ELSE 'Gift to impress relatives'

END,

Title

GO

複製代碼

注意,爲了在 GROUP BY 塊中使用 CASE,查詢語句需要在 GROUP BY 塊中重複 SELECT 塊中的 CASE 塊。

除了選擇自定義字段之外,在很多情況下 CASE 都非常有用。再深入一步,你還可以得到你以前認爲不可能得到的分組排序結果集。

四,根據條件有選擇的UPDATE。

例,有如下更新條件

?工資5000以上的職員,工資減少10%

?工資在2000到4600之間的職員,工資增加15%

很容易考慮的是選擇執行兩次UPDATE語句,如下所示

複製代碼

--條件1

UPDATE Personnel

SET salary = salary * 0.9

WHERE salary >= 5000;

--條件2

UPDATE Personnel

SET salary = salary * 1.15

WHERE salary >= 2000 AND salary < 4600;

複製代碼

但是事情沒有想象得那麼簡單,假設有個人工資5000塊。首先,按照條件1,工資減少10%,變成工資4500。接下來運行第二個SQL時候,因爲這個人的工資是4500在2000到4600的範圍之內,需增加15%,最後這個人的工資結果是5175,不但沒有減少,反而增加了。如果要是反過來執行,那麼工資4600的人相反會變成減少工資。暫且不管這個規章是多麼荒誕,如果想要一個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_ol = tbl_ol )

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語句進行查詢。

條件1

--條件1:只選擇了一門課程的學生

SELECT std_id, MAX(class_id) AS main_class

FROM Studentclass

GROUP BY std_id

HAVING COUNT(*) = 1;

執行結果1

STD_ID MAIN_class

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

300 4

400 5

500 6

條件2

--條件2:選擇多門課程的學生

SELECT std_id, class_id AS main_class

FROM Studentclass

WHERE main_class_flg = 'Y' ;

執行結果2

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。

猜你喜歡

熱點閱讀

最新文章

推薦閱讀