想飛就別怕摔

          大爺?shù)牟M罵人

          SQL中CASE條件表達(dá)式

          SQL CASE 表達(dá)式是一種通用的條件表達(dá)式,類似于其它語言中的 if/else 語句。

          CASE WHEN condition THEN result
          [WHEN ...]
          [ELSE result]
          END

          CASE 子句可以用于任何表達(dá)式可以有效存在的地方。 condition 是一個(gè)返回boolean 的表達(dá)式。 如果結(jié)果為真,那么 CASE 表達(dá)式的結(jié)果就是符合條件的 result。 如果結(jié)果為假,那么以相同方式搜尋任何隨后的 WHEN 子句。 如果沒有 WHEN condition 為真,那么 case 表達(dá)式的結(jié)果就是在 ELSE 子句里的值。 如果省略了 ELSE 子句而且沒有匹配的條件, 結(jié)果為 NULL。

          例子:

          SELECT * FROM test;
          a
          ---
          1
          2
          3
          SELECT a,
          CASE WHEN a=1 THEN 'one'
          WHEN a=2 THEN 'two'
          ELSE 'other'
          END
          FROM test;
          a | case
          ---+-------
          1 | one
          2 | two
          3 | other

           

          所有 result 表達(dá)式的數(shù)據(jù)的類型都必須可以轉(zhuǎn)換成單一的輸出類型。 

          下面這個(gè)"簡單的" CASE 表達(dá)式是上面的通用形式的一個(gè)特殊的變種。

          CASE expression
          WHEN value THEN result
          [WHEN ...]
          [ELSE result]
          END

          先計(jì)算 expression 的值, 然后與所有在WHEN 子句里聲明的 value 對(duì)比,直到找到一個(gè)相等的。 如果沒有找到匹配的,則返回在 ELSE 子句里的 result (或者 NULL)。 這個(gè)類似于 C 里的 switch 語句。

          上面的例子可以用簡單 CASE 語法來寫:

          SELECT a,
          CASE a WHEN 1 THEN 'one'
          WHEN 2 THEN 'two'
          ELSE 'other'
          END
          FROM test;
          a | case
          ---+-------
          1 | one
          2 | two
          3 | other

           

          CASE 表達(dá)式并不計(jì)算任何對(duì)于判斷結(jié)果并不需要的子表達(dá)式。 比如,下面是一個(gè)可以避免被零除的方法:

          SELECT ... WHERE CASE WHEN x <> 0 THEN y/x > 1.5 ELSE false END;

          例1:一道SQL語句面試題
          表內(nèi)容:
          2005-05-09 勝
          2005-05-09 勝
          2005-05-09 負(fù)
          2005-05-09 負(fù)
          2005-05-10 勝
          2005-05-10 負(fù)
          2005-05-10 負(fù)

          如果要生成下列結(jié)果, 該如何寫sql語句?

                     勝 負(fù)
          2005-05-09 2 2
          2005-05-10 1 2
          ----------------------------------------------------------
          create table #tmp(rq varchar(10),shengfu nchar(1))

          insert into #tmp values('2005-05-09','勝')
          insert into #tmp values('2005-05-09','勝')
          insert into #tmp values('2005-05-09','負(fù)')
          insert into #tmp values('2005-05-09','負(fù)')
          insert into #tmp values('2005-05-10','勝')
          insert into #tmp values('2005-05-10','負(fù)')
          insert into #tmp values('2005-05-10','負(fù)')

          select rq, sum(case when shengfu='勝' then 1 else 0 end)'勝',
                     sum(case when shengfu='負(fù)' then 1 else 0 end)'負(fù)'
                     from #tmp group by rq
          ----------------------------------------------------------






          例2:表中有A B C三列,用SQL語句實(shí)現(xiàn):當(dāng)A列大于B列時(shí)選擇A列否則選擇B列,當(dāng)B列大于C列時(shí)選擇B列否則選擇C列。










          select (case when a>b then a else b end ),
                 (case when b>c then b esle c end)
                 from table_name

          ----------------------------------------------------------
          例3:有一張表,里面有3個(gè)字段:語文,數(shù)學(xué),英語。其中有3條記錄分別表示語文70分,數(shù)學(xué)80分,英語58分,請(qǐng)用一條sql語句查詢出這三條記錄并按以下條件顯示出來(并寫出您的思路):  
             大于或等于80表示優(yōu)秀,大于或等于60表示及格,小于60分表示不及格。  
                 顯示格式:  
                 語文              數(shù)學(xué)                英語  
                 及格              優(yōu)秀                不及格    
          ----------------------------------------------------------
          select
              (case when 語文>=80 then '優(yōu)秀'
                    when 語文>=60 then '及格'
                    else '不及格' end) as 語文,
              (case when 數(shù)學(xué)>=80 then '優(yōu)秀'
                    when 數(shù)學(xué)>=60 then '及格'
                    else '不及格' end) as 數(shù)學(xué),
              (case when 英語>=80 then '優(yōu)秀'
                    when 英語>=60 then '及格'
                   else '不及格' end) as 英語,
          from table
          ----------------------------------------------------------------

          posted on 2008-11-13 15:35 生命的綻放 閱讀(3167) 評(píng)論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫

          <2008年11月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(5)

          隨筆分類(94)

          隨筆檔案(93)

          文章分類(5)

          文章檔案(5)

          相冊(cè)

          JAVA之橋

          SQL之音

          兄弟之窗

          常用工具下載

          積分與排名

          最新評(píng)論

          閱讀排行榜

          主站蜘蛛池模板: 平泉县| 富川| 五寨县| 四子王旗| 柘城县| 通海县| 阿合奇县| 准格尔旗| 赤壁市| 阳山县| 南部县| 海南省| 曲靖市| 阿荣旗| 五寨县| 饶河县| 巢湖市| 郑州市| 驻马店市| 宣城市| 澜沧| 通江县| 微山县| 天祝| 揭阳市| 高淳县| 雷波县| 尚义县| 佛冈县| 嘉黎县| 绥化市| 华容县| 刚察县| 平定县| 安仁县| 揭西县| 子长县| 镇雄县| 铜梁县| 韶山市| 绵竹市|