<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
    主站蜘蛛池模板: 久久亚洲精品无码av| 亚洲熟妇AV一区二区三区浪潮| 中美日韩在线网免费毛片视频| 日韩免费a级在线观看| 丰满亚洲大尺度无码无码专线| 日本二区免费一片黄2019| 亚洲av成人一区二区三区观看在线 | 亚洲AV无码久久精品成人| 男女拍拍拍免费视频网站| 亚洲午夜久久久影院伊人| 国产无遮挡裸体免费视频在线观看 | 成在线人直播免费视频| 久久精品国产亚洲7777| 中国人免费观看高清在线观看二区| 久久亚洲国产精品123区| 国产午夜不卡AV免费| 亚洲一区免费观看| 免费精品国产日韩热久久| 久久久久亚洲AV无码去区首| 亚洲人成电影网站国产精品| 青青操视频在线免费观看| 亚洲短视频在线观看| 成人毛片免费观看视频在线| 国产亚洲精品精品精品| 国产亚洲精品成人AA片新蒲金| 午夜影院免费观看| 亚洲欧美中文日韩视频| 少妇亚洲免费精品| 久久狠狠躁免费观看| 亚洲乱码无人区卡1卡2卡3| 久久久无码精品亚洲日韩软件| 在线人成精品免费视频| 亚洲av乱码中文一区二区三区| 亚洲综合色视频在线观看| 69免费视频大片| 亚洲国产精品无码第一区二区三区 | 亚洲第一成人影院| 99在线观看精品免费99| 亚洲精品av无码喷奶水糖心| 亚洲精品成人无码中文毛片不卡| 一个人看的www在线观看免费|