日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL中条件和比较关键字Case的使用方法(case的结果就是得到了一个值)

發布時間:2024/6/5 数据库 65 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL中条件和比较关键字Case的使用方法(case的结果就是得到了一个值) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Case具有兩種格式。簡單Case函數和Case搜索函數。 --簡單Case函數
CASEsex
WHEN'1'THEN'男'
WHEN'2'THEN'女'
ELSE'其他'END
--Case搜索函數
CASEWHENsex = '1'THEN'男'
WHENsex = '2'THEN'女'
ELSE'其他'END

這兩種方式,可以實現相同的功能。簡單Case函數的寫法相對比較簡潔,但是和Case搜索函數相比,功能方面會有些限制,比如寫判斷式。
還有一個需要注意的問題,Case函數只返回第一個符合條件的值,剩下的Case部分將會被自動忽略。
--比如說,下面這段SQL,你永遠無法得到“第二類”這個結果
CASEWHENcol_1 IN( 'a' , 'b' ) THEN'第一類'
WHENcol_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代碼如下: SELECTSUM(population),
CASEcountry
WHEN'中國'THEN'亞洲'
WHEN'印度'THEN'亞洲'
WHEN'日本'THEN'亞洲'
WHEN'美國'THEN'北美洲'
WHEN'加拿大'THEN'北美洲'
WHEN'墨西哥'THEN'北美洲'
ELSE'其他'END
FROMTable_A
GROUPBYCASEcountry
WHEN'中國'THEN'亞洲'
WHEN'印度'THEN'亞洲'
WHEN'日本'THEN'亞洲'
WHEN'美國'THEN'北美洲'
WHEN'加拿大'THEN'北美洲'
WHEN'墨西哥'THEN'北美洲'
ELSE'其他'END ;

同樣的,我們也可以用這個方法來判斷工資的等級,并統計每一等級的人數。SQL代碼如下;
SELECT
CASEWHENsalary <= 500 THEN'1'
WHENsalary > 500 ANDsalary <= 600 THEN'2'
WHENsalary > 600 ANDsalary <= 800 THEN'3'
WHENsalary > 800 ANDsalary <= 1000 THEN'4'
ELSENULLENDsalary_class,
COUNT(*)
FROMTable_A
GROUPBY
CASEWHENsalary <= 500 THEN'1'
WHENsalary > 500 ANDsalary <= 600 THEN'2'
WHENsalary > 600 ANDsalary <= 800 THEN'3'
WHENsalary > 800 ANDsalary <= 1000 THEN'4'
ELSENULLEND ;

二,用一個SQL語句完成不同條件的分組。

有如下數據
國家(country)性別(sex)人口(population)
中國1340
中國2260
美國145
美國255
加拿大151
加拿大249
英國140
英國260

按照國家和性別進行分組,得出結果如下
國家
中國340260
美國4555
加拿大5149
英國4060

普通情況下,用UNION也可以實現用一條語句進行查詢。但是那樣增加消耗(兩個Select部分),而且SQL語句會比較長。
下面是一個是用Case函數來完成這個功能的例子
SELECTcountry,
SUM( CASEWHENsex = '1'THEN
population ELSE0 END ), --男性人口
SUM( CASEWHENsex = '2'THEN
population ELSE0 END ) --女性人口
FROMTable_A
GROUPBYcountry;

這樣我們使用Select,完成對二維表的輸出形式,充分顯示了Case函數的強大。

三,在Check中使用Case函數。

在Check中使用Case函數在很多情況下都是非常不錯的解決方法。可能有很多人根本就不用Check,那么我建議你在看過下面的例子之后也嘗試一下在SQL中使用Check。
下面我們來舉個例子
公司A,這個公司有個規定,女職員的工資必須高于1000塊。如果用Check和Case來表現的話,如下所示 CONSTRAINTcheck_salary CHECK
( CASEWHENsex = '2'
THENCASEWHENsalary > 1000
THEN1 ELSE0 END
ELSE1 END= 1 )

如果單純使用Check,如下所示
CONSTRAINTcheck_salary CHECK
( sex = '2'ANDsalary > 1000 )

女職員的條件倒是符合了,男職員就無法輸入了。 四,根據條件有選擇的UPDATE。

例,有如下更新條件
  • 工資5000以上的職員,工資減少10%
  • 工資在2000到4600之間的職員,工資增加15%
  • 很容易考慮的是選擇執行兩次UPDATE語句,如下所示
    --條件1
    UPDATEPersonnel
    SETsalary = salary * 0.9
    WHEREsalary >= 5000;
    --條件2
    UPDATEPersonnel
    SETsalary = salary * 1.15
    WHEREsalary >= 2000 ANDsalary < 4600;

    但是事情沒有想象得那么簡單,假設有個人工資5000塊。首先,按照條件1,工資減少10%,變成工資4500。接下來運行第二個SQL時候,因為這個人的工資是4500在2000到4600的范圍之內, 需增加15%,最后這個人的工資結果是5175,不但沒有減少,反而增加了。如果要是反過來執行,那么工資4600的人相反會變成減少工資。暫且不管這個規章是多么荒誕,如果想要一個SQL 語句實現這個功能的話,我們需要用到Case函數。代碼如下:
    UPDATEPersonnel
    SETsalary = CASEWHENsalary >= 5000
    THENsalary * 0.9
    WHENsalary >= 2000 ANDsalary < 4600
    THENsalary * 1.15
    ELSEsalary END ;

    這里要注意一點,最后一行的ELSE salary是必需的,要是沒有這行,不符合這兩個條件的人的工資將會被寫成NUll,那可就大事不妙了。在Case函數中Else部分的默認值是NULL,這點是需要注意的地方。
    這種方法還可以在很多地方使用,比如說變更主鍵這種累活。
    一般情況下,要想把兩條數據的Primary key,a和b交換,需要經過臨時存儲,拷貝,讀回數據的三個過程,要是使用Case函數的話,一切都變得簡單多了。
    p_keycol_1col_2
    a1張三
    b2李四
    c3王五


    假設有如上數據,需要把主鍵a 和b 相互交換。用Case函數來實現的話,代碼如下
    UPDATESomeTable
    SETp_key = CASEWHENp_key = 'a'
    THEN'b'
    WHENp_key = 'b'
    THEN'a'
    ELSEp_key END
    WHEREp_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的時候
    SELECTkeyCol,
    CASEWHENkeyCol IN( SELECTkeyCol FROMtbl_B )
    THEN'Matched'
    ELSE'Unmatched'ENDLabel
    FROMtbl_A;
    --使用EXISTS的時候
    SELECTkeyCol,
    CASEWHENEXISTS ( SELECT* FROMtbl_B
    WHEREtbl_A.keyCol = tbl_B.keyCol )
    THEN'Matched'
    ELSE'Unmatched'ENDLabel
    FROMtbl_A;

    使用IN和EXISTS的結果是相同的。也可以使用NOT IN和NOT EXISTS,但是這個時候要注意NULL的情況。

    六,在Case函數中使用合計函數

    假設有下面一個表
    學號(std_id)課程ID(class_id)課程名(class_name)主修flag(main_class_flg)
    1001經濟學Y
    1002歷史學N
    2002歷史學N
    2003考古學Y
    2004計算機N
    3004計算機N
    4005化學N
    5006數學N

    有的學生選擇了同時修幾門課程(100,200)也有的學生只選擇了一門課程(300,400,500)。選修多門課程的學生,要選擇一門課程作為主修,主修flag里面寫入 Y。只選擇一門課程的學生,主修flag為N(實際上要是寫入Y的話,就沒有下面的麻煩事了,為了舉例子,還請多多包含)。
    現在我們要按照下面兩個條件對這個表進行查詢
  • 只選修一門課程的人,返回那門課程的ID
  • 選修多門課程的人,返回所選的主課程ID

  • 簡單的想法就是,執行兩條不同的SQL語句進行查詢。
    條件1
    --條件1:只選擇了一門課程的學生
    SELECTstd_id, MAX(class_id) ASmain_class
    FROMStudentclass
    GROUPBYstd_id
    HAVINGCOUNT(*) = 1;

    執行結果1
    STD_ID MAIN_class
    ------ ----------
    300 4
    400 5
    500 6

    條件2
    --條件2:選擇多門課程的學生
    SELECTstd_id, class_id ASmain_class
    FROMStudentclass
    WHEREmain_class_flg = 'Y';

    執行結果2
    STD_ID MAIN_class
    ------ ----------
    100 1
    200 3

    如果使用Case函數,我們只要一條SQL語句就可以解決問題,具體如下所示
    SELECTstd_id,
    CASEWHENCOUNT(*) = 1 --只選擇一門課程的學生的情況
    THENMAX(class_id)
    ELSEMAX(CASEWHENmain_class_flg = 'Y'
    THENclass_id
    ELSENULLEND
    )
    ENDASmain_class
    FROMStudentclass
    GROUPBYstd_id;

    運行結果
    STD_ID MAIN_class
    ------ ----------
    100 1
    200 3
    300 4
    400 5
    500 6

    通過在Case函數中嵌套Case函數,在合計函數中使用Case函數等方法,我們可以輕松的解決這個問題。使用Case函數給我們帶來了更大的自由度。
    最后提醒一下使用Case函數的新手注意不要犯下面的錯誤
    CASEcol_1
    WHEN1   THEN'Right'
    WHENNULLTHEN'Wrong'
    END

    在這個語句中When Null這一行總是返回unknown,所以永遠不會出現Wrong的情況。因為這句可以替換成WHEN col_1 = NULL,這是一個錯誤的用法,這個時候我們應該選擇用WHEN col_1 IS NULL。 case的作用就是得到了一個返回值(Variant),或一個新的字段,這個值可以和普通值一樣做各種操作

    轉載于:https://www.cnblogs.com/dongzhiquan/archive/2009/04/13/1994905.html

    與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的SQL中条件和比较关键字Case的使用方法(case的结果就是得到了一个值)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。