<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 431,  comments - 344,  trackbacks - 0
    Case具有兩種格式。簡(jiǎn)單Case函數(shù)和Case搜索函數(shù)。
    --簡(jiǎn)單Case函數(shù)
    CASE sex
    WHEN '1' THEN '男'
    WHEN '2' THEN '女'
    ELSE '其他' END
    --Case搜索函數(shù)
    CASE WHEN sex = '1' THEN '男'
    WHEN sex = '2' THEN '女'
    ELSE '其他' END
    

    這兩種方式,可以實(shí)現(xiàn)相同的功能。簡(jiǎn)單Case函數(shù)的寫(xiě)法相對(duì)比較簡(jiǎn)潔,但是和Case搜索函數(shù)相比,功能方面會(huì)有些限制,比如寫(xiě)判斷式。
    還有一個(gè)需要注意的問(wèn)題,Case函數(shù)只返回第一個(gè)符合條件的值,剩下的Case部分將會(huì)被自動(dòng)忽略。
    --比如說(shuō),下面這段SQL,你永遠(yuǎn)無(wú)法得到“第二類”這個(gè)結(jié)果
    CASE WHEN col_1 IN ( 'a', 'b') THEN '第一類'
    WHEN col_1 IN ('a')       THEN '第二類'
    ELSE'其他' END

    下面我們來(lái)看一下,使用Case函數(shù)都能做些什么事情。

    一,已知數(shù)據(jù)按照另外一種方式進(jìn)行分組,分析。

    有如下數(shù)據(jù):(為了看得更清楚,我并沒(méi)有使用國(guó)家代碼,而是直接用國(guó)家名作為Primary Key)
    國(guó)家(country) 人口(population)
    中國(guó) 600
    美國(guó) 100
    加拿大 100
    英國(guó) 200
    法國(guó) 300
    日本 250
    德國(guó) 200
    墨西哥 50
    印度 250

    根據(jù)這個(gè)國(guó)家人口數(shù)據(jù),統(tǒng)計(jì)亞洲和北美洲的人口數(shù)量。應(yīng)該得到下面這個(gè)結(jié)果。
    人口
    亞洲 1100
    北美洲 250
    其他 700

    想要解決這個(gè)問(wèn)題,你會(huì)怎么做?生成一個(gè)帶有洲Code的View,是一個(gè)解決方法,但是這樣很難動(dòng)態(tài)的改變統(tǒng)計(jì)的方式。
    如果使用Case函數(shù),SQL代碼如下:
    SELECT  SUM(population),
    CASE country
    WHEN '中國(guó)'     THEN '亞洲'
    WHEN '印度'     THEN '亞洲'
    WHEN '日本'     THEN '亞洲'
    WHEN '美國(guó)'     THEN '北美洲'
    WHEN '加拿大'  THEN '北美洲'
    WHEN '墨西哥'  THEN '北美洲'
    ELSE '其他' END
    FROM    Table_A
    GROUP BY CASE country
    WHEN '中國(guó)'     THEN '亞洲'
    WHEN '印度'     THEN '亞洲'
    WHEN '日本'     THEN '亞洲'
    WHEN '美國(guó)'     THEN '北美洲'
    WHEN '加拿大'  THEN '北美洲'
    WHEN '墨西哥'  THEN '北美洲'
    ELSE '其他' END;
    

    同樣的,我們也可以用這個(gè)方法來(lái)判斷工資的等級(jí),并統(tǒng)計(jì)每一等級(jí)的人數(shù)。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;
    

    二,用一個(gè)SQL語(yǔ)句完成不同條件的分組。

    有如下數(shù)據(jù)
    國(guó)家(country) 性別(sex) 人口(population)
    中國(guó) 1 340
    中國(guó) 2 260
    美國(guó) 1 45
    美國(guó) 2 55
    加拿大 1 51
    加拿大 2 49
    英國(guó) 1 40
    英國(guó) 2 60

    按照國(guó)家和性別進(jìn)行分組,得出結(jié)果如下
    國(guó)家
    中國(guó) 340 260
    美國(guó) 45 55
    加拿大 51 49
    英國(guó) 40 60

    普通情況下,用UNION也可以實(shí)現(xiàn)用一條語(yǔ)句進(jìn)行查詢。但是那樣增加消耗(兩個(gè)Select部分),而且SQL語(yǔ)句會(huì)比較長(zhǎng)。
    下面是一個(gè)是用Case函數(shù)來(lái)完成這個(gè)功能的例子
    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,完成對(duì)二維表的輸出形式,充分顯示了Case函數(shù)的強(qiáng)大。

    三,在Check中使用Case函數(shù)。

    在Check中使用Case函數(shù)在很多情況下都是非常不錯(cuò)的解決方法。可能有很多人根本就不用Check,那么我建議你在看過(guò)下面的例子之后也嘗試一下在SQL中使用Check。
    下面我們來(lái)舉個(gè)例子
    公司A,這個(gè)公司有個(gè)規(guī)定,女職員的工資必須高于1000塊。如果用Check和Case來(lái)表現(xiàn)的話,如下所示
    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 )
    

    女職員的條件倒是符合了,男職員就無(wú)法輸入了。

    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

    posted on 2008-09-24 11:20 周銳 閱讀(358) 評(píng)論(0)  編輯  收藏 所屬分類: MySQLOracleSQL Server
    主站蜘蛛池模板: 色噜噜的亚洲男人的天堂| 在线免费观看中文字幕| 久久国产乱子伦精品免费一| 一区二区免费视频| 91视频免费网址| 毛片高清视频在线看免费观看| 中文字幕无码免费久久99 | 老司机午夜在线视频免费观| 亚洲欧美日韩中文高清www777| 亚洲日韩在线中文字幕综合| 色多多免费视频观看区一区| AAAAA级少妇高潮大片免费看| 免费无码av片在线观看| 69视频在线是免费观看| 久久国内免费视频| 免费大黄网站在线观| 久久精品国产亚洲沈樵| 亚洲一区二区三区播放在线| 亚洲av无码一区二区三区四区| 永久免费观看黄网站| 99热在线免费播放| 日韩一品在线播放视频一品免费| 亚洲中文字幕无码爆乳av中文| 无码专区—VA亚洲V天堂| 亚洲欧美成人av在线观看| 中文字幕无码免费久久9一区9 | www.免费在线观看| 亚洲精品国产高清嫩草影院| 亚洲欧洲精品国产区| 免费福利在线观看| 噼里啪啦电影在线观看免费高清| 亚洲性久久久影院| 亚洲成a人片在线不卡一二三区| 香蕉免费一级视频在线观看| 成人免费午间影院在线观看| 亚洲AV综合色一区二区三区| 国产亚洲精品2021自在线| 免费无码VA一区二区三区| 亚洲成AV人网址| 亚洲成人激情小说| 蜜桃视频在线观看免费视频网站WWW |