SQL语句中CASE WHEN用法

1.
今天下午因为这个原因做了一个下午,因为,项目中,联系人详细信息这一个页面中,联系人的性别在数据库字段的保存,男的用0表示,女的用1表示,所以,如果直接就读出来绑定到DataList中,性别就显示成0或1了。所以需要将Sql语句进行改造。先看看我原先的做法,这样做,组长叫我重做了,要叫我要CASE WHEN来写。

    不用CASE  WHEN 的做法。源代码如下:

string sql =" select  *  from CONTACTPERSON ,CUSTOMER  where CONTACTPERSONID = ' "+strContactid+" '  and CONTACTPERSON.CUSTOMERID =CUSTOMER.CUSTOMERID";
DataSet ds =new DataSet();
ds =Common.GetDSCommon(sql);   

if(ds.Tables [ 0 ].Rows [ 0 ][ "CONTACTPERSONSEX" ].ToString() ==" 0")
   {
    ds.Tables [ 0 ].Rows [ 0 ][ "CONTACTPERSONSEX" ] ="男";
   }
    else
   {
                ds.Tables [ 0 ].Rows [ 0 ][ "CONTACTPERSONSEX" ] ="女";
   }

 使用CASE WHEN做法。

  string sql =" select CUSTOMER. *,CONTACTPERSON.CONTACTPERSONNAME,CONTACTPERSON.CONTACTPERSONBIRTHDAY,CONTACTPERSON.CONTACTPERSONPOSITION,CONTACTPERSON.CONTACTPERSONDEPTNAME,";
   sql +="CONTACTPERSON.TELEPHONE,CONTACTPERSON.MAIL,CONTACTPERSON.CITY,CONTACTPERSON.PROVINCE,CONTACTPERSON.POSTCODE,CONTACTPERSON.COUNTRY,CONTACTPERSON.MEMO,";
   sql +="CONTACTPERSON.DIRECTOR,";
    
    sql +=" case  when CONTACTPERSON.CONTACTPERSONSEX  =  ' 0 ' then  ' '  when CONTACTPERSON.CONTACTPERSONSEX =  ' 1 '  then  ' '  end  as CONTACTPERSONSEX  from CUSTOMER ,CONTACTPERSON   where CONTACTPERSONID = ' "+strContactid+" '  and CONTACTPERSON.CUSTOMERID =CUSTOMER.CUSTOMERID";
   可以看出这样明显加长了,SQL语句,这样做有什么好处呢?

2.
 SQL条件控制( case  when... then... else... end

我的语句:(SQL 
2000
1:
select ByeTime,case when len(ByeTime)>0 then str(DATEDIFF(day,ComeInTime,ByeTime)) else DATEDIFF(day,ComeInTime,getdate()) end as test
from myUser where DelFlag='0' and UserID='cq'
2:
select ByeTime,case when len(ByeTime)>0 then str(DATEDIFF(day,ComeInTime,ByeTime))+'(已离职)' end as test
from myUser where DelFlag='0' and UserID='cq'
3:
select ByeTime,case when len(ByeTime)>0 then str(DATEDIFF(day,ComeInTime,ByeTime))+'(已离职)'
else DATEDIFF(day,ComeInTime,getdate()) end as test
from myUser where DelFlag='0' and UserID='cq'

为什么1 和2 执行都没有问题,
3 却报“将 varchar 值 ' 480(已离职)' 转换为数据类型为 int 的列时发生语法错误。”


select ByeTime,case when len(ByeTime)>0 then str(DATEDIFF(day,ComeInTime,ByeTime))+'(已离职)'
else str(DATEDIFF(day,ComeInTime,getdate())) end as test
from myUser where DelFlag='0' and UserID='cq'
这样试一下.语法应该没有问题


3.

WHEN  THEN
WHEN  THEN
ELSE
END
-- ------------
   select  count( *as ct ,  CASE
   WHEN (Pro_state =  1THEN  ' 待审 '
   WHEN (Pro_state =  2THEN  ' 已审 '
   WHEN (Pro_state =  3THEN  ' 办理中 '
   WHEN (Pro_state =  4THEN  ' 已申退 '
   WHEN (Pro_state =  5THEN  ' 来信 '
   WHEN (Pro_state =  6THEN  ' 办理完成 '   
   WHEN (Pro_state =  7THEN  ' 未予立案 '   
  end  as pro_state
from vw_proposals_query  where  1 = 1  GROUP  BY   pro_state
 
结果: 
ct   pro -state
30   办理中
7    来信
1   办理完成
5   未予立案
 
解读:
查询总数和pro_state 当 Pro_state =  1 时以  ' 待审 ' 替代表示
                   当 Pro_state =  2 时以  ' 已审 ' 替代表示
                   当 Pro_state =  3 时以  ' 办理中 ' 替代表示
                   。。。。。。
4.
CASE 可能是 SQL 中被误用最多的关键字之一。虽然你可能以前用过这个关键字来创建字段,但是它还具有更多用法。例如,你可以在  WHERE 子句中使用  CASE

首先让我们看一下  CASE 的语法。在一般的  SELECT 中,其语法如下:

SELECT  <myColumnSpec >  = 
CASE 
WHEN  <A >  THEN  <somethingA > 
WHEN  <B >  THEN  <somethingB > 
ELSE  <somethingE > 
END

在上面的代码中需要用具体的参数代替尖括号中的内容。下面是一个简单的例子:

USE pubs 
GO 
SELECT 
    Title, 
     ' Price Range '  = 
     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 
FROM titles 
ORDER  BY price 
GO

这是  CASE 的典型用法,但是使用  CASE 其实可以做更多的事情。比方说下面的  GROUP  BY 子句中的  CASE

SELECT  ' Number of Titles 'Count( *
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 
GO

你甚至还可以组合这些选项,添加一个  ORDER  BY 子句,如下所示:

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

注意,为了在  GROUP  BY 块中使用  CASE,查询语句需要在  GROUP  BY 块中重复  SELECT 块中的  CASE 块。

除了选择自定义字段之外,在很多情况下  CASE 都非常有用。再深入一步,你还可以得到你以前认为不可能得到的分组排序结果集。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值