天天看點

oracle中sql的case語句運用--根據不同條件去排序!

--case語句的種類:

1.簡單case語句

文法:

  case exp when comexp then returnvalue

           ...

           when comexp then returnvalue

           else returnvalue

   end

 case到end之間相當于一個具體的值,可以做運算,取别名,嵌套case 等等。

 隻要把case到end當作一個運算結果的表達式就可以了。

舉例:

  select cust_last_name,

         case credit_limit when 100 then 'low'

                           when 5000 then 'high'

                           else 'medium'

         end

    from customers;

--注意事項:

1.case 表達式傳回的是一個确定的value,若前面的都不比對,則傳回else中的項(相當于 =,是以也不能比對null).

2.簡單case 中的表達式,when 後面的表達式類型應該全部保持一緻.

3.所有的then 後面的return_value類型要保持一緻.

4.對于簡單case 表達式,也就是case 表達式 when…那麼when null 總是取不到。也就是case 後面的表達式如果值為null,不會與when null 比對,隻會與else比對.

--case中嵌套子查詢

Case語句中可以使用子查詢,但是必須傳回一行,不可以是多行.

如:

select case (select count(*) as s1 from t1 where a = 1)

          when (select count(*) as s2 from t1, t2 where t1.a = t2.a and t2.a = 1) then '相等'

          else '不相等'

      end

 from dual;

***CASE之應用實踐:

SELECT JCXX.ID,

      JCXX.FXSJ,

      JCXX.ZT,

      jcxx.xgsj

 FROM T_JCXX JCXX

 JOIN T_ZDRYBK_XQ ZDRY

   ON JCXX.ID = ZDRY.JCXX_ID

 JOIN T_JBXX_ZDRYK RYK

   ON RYK.RYJBXX_ID = ZDRY.ZDRY_ID

  AND RYK.SCBS = '0'

WHERE JCXX.SCBS = '0'

  AND JCXX.SFXXYW = '0'

order by JCXX.ZT,

         case jcxx.zt

           when '0' then

            JCXX.fxsj

           else

            jcxx.xgsj

         end desc nulls last

         ,jcxx.id desc nulls last ;

介紹:T_JCXX 基礎表 T_ZDRYBK_XQ  重點人員詳情表 T_JBXX_ZDRYK  人員基本資訊 關系1:1

需求:根據zt升序,當zt為0時,根據fxsj倒序,當zt為1時,根據xgsj倒序。

id desc nulls last 一般防止髒資料導緻前面排序的字段都是為空的。

nulls last 防止髒資料都為空的時候,一般oarcle預設空排序第一個,是以這種資料手動放在最後。