【转】IsNull 和 SQL语句中CASE WHEN用法收藏
 
【转】IsNull 和 SQL语句中CASE WHEN用法
1、ISNULL  
  使用指定的替换值替换   NULL。  
   
  语法  
  ISNULL   (   check_expression   ,   replacement_value   )    
   
  参数  
  check_expression  
   
  将被检查是否为   NULL的表达式。check_expression   可以是任何类型的。  
   
  replacement_value  
   
  在   check_expression   为   NULL时将返回的表达式。replacement_value   必须与   check_expresssion   具有相同的类型。    
   
  返回类型  
  返回与   check_expression   相同的类型。  
   
  注释  
  如果   check_expression   不为   NULL,那么返回该表达式的值;否则返回   replacement_value。  
   
  示例  
  A.   将   ISNULL   与   AVG   一起使用  
  下面的示例查找所有书的平均价格,用值   $10.00   替换   titles   表的   price   列中的所有   NULL   条目。  
   
  USE   pubs  
  GO  
  SELECT   AVG(ISNULL(price,   $10.00))  
  FROM   titles  
  GO  
   
  下面是结果集:  
   
  --------------------------    
  14.24                                              
   
  (1   row(s)   affected)  
   
  B.   使用   ISNULL  
  下面的示例为   titles   表中的所有书选择书名、类型及价格。如果一个书名的价格是   NULL,那么在结果集中显示的价格为   0.00。  
   
  USE   pubs  
  GO  
  SELECT   SUBSTRING(title,   1,   15)   AS   Title,   type   AS   Type,    
        ISNULL(price,   0.00)   AS   Price  
  FROM   titles  
  GO  
   
  下面是结果集:  
   
  Title                       Type                   Price                      
  ---------------   ------------   --------------------------    
  The   Busy   Execut   business           19.99                                              
  Cooking   with   Co   business           11.95                                              
  You   Can   Combat     business           2.99                                                
  Straight   Talk   A   business           19.99                                              
  Silicon   Valley     mod_cook           19.99                                              
  The   Gourmet   Mic   mod_cook           2.99                                                
  The   Psychology     UNDECIDED         0.00                                                
  But   Is   It   User     popular_comp   22.95                                              
  Secrets   of   Sili   popular_comp   20.00                                              
  Net   Etiquette       popular_comp   0.00                                                
  Computer   Phobic   psychology       21.59                                              
  Is   Anger   the   En   psychology       10.95                                              
  Life   Without   Fe   psychology       7.00                                                
  Prolonged   Data     psychology       19.99                                              
  Emotional   Secur   psychology       7.99                                                
  Onions,   Leeks,     trad_cook         20.95                                              
  Fifty   Years   in     trad_cook         11.95                                              
  Sushi,   Anyone?     trad_cook         14.99                                              
   
  (18   row(s)   affected)

2、项目中,联系人详细信息这一个页面中,联系人的性别在数据库字段的保存,男的用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语句,这样做有什么好处呢?

3、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'
这样试一下.语法应该没有问题

4、WHEN THEN
WHEN THEN
ELSE
END
--------------
  select count(*) as ct , CASE
  WHEN (Pro_state= 1) THEN '待审'
  WHEN (Pro_state= 2) THEN '已审'
  WHEN (Pro_state= 3) THEN '办理中'
  WHEN (Pro_state= 4) THEN '已申退'
  WHEN (Pro_state= 5) THEN '来信'
  WHEN (Pro_state= 6) THEN '办理完成'  
  WHEN (Pro_state= 7) THEN '未予立案'  
 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 时以 '办理中' 替代表示
                   。。。。。。

5、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 都非常有用。再深入一步,你还可以得到你以前认为不可能得到的分组排序结果集。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/cqcp03/archive/2008/12/31/3663200.aspx

转载于:https://www.cnblogs.com/zhangliyu/archive/2009/06/25/1511287.html

IsNull 和 SQL语句中CASE WHEN用法相关推荐

  1. sql语句中的in用法示例_PHP中的循环语句和示例

    sql语句中的in用法示例 循环 (Loops) Imagine that we need a program that says "hello world" 100 times. ...

  2. sql语句中的in用法示例_示例中JavaScript in操作符

    sql语句中的in用法示例 One of the first topics you'll come across when learning JavaScript (or any other prog ...

  3. mysql语句中limt_mysql sql语句中的limit用法

    mysql sql语句中的limit用法 1.select * from tablename limit 100,15 从100条记录后开始(不包括第100条记录)取出15条记录 (实际取出的是第 1 ...

  4. sql语句中的limit用法

    sql语句中的limit用法 limit 用于限制查询结果返回. 用法: limit a,b 其中a表示查询数据的起始位置,b表示返回的数量. (MySQL数据库中的记录是从0开始的) 举例: SEL ...

  5. SQL语句中JOIN的用法

    记录:257 写SQL最高境界:SELECT * FROM 表名.当然这是一句自嘲.探究一下SQL语句中JOIN的用法,直到经历这个场景,变得想验证一下究竟. 一.场景 把关系型数据库A中表TEST_ ...

  6. SQL语句中EXISTS的用法

    记录:258 在业务开展中,会遇到类似需求. 需求1:UPDATE表TEST_TB01中的记录:满足条件:这些记录不在TEST_TB02中. 需求2:UPDATE表TEST_TB01中的记录:满足条件 ...

  7. SQL语句中Cast的用法

    GPS平台.网站建设.软件开发.系统运维,找森大网络科技! https://cnsendnet.taobao.com 来自森大科技官方博客 http://www.cnsendblog.com/inde ...

  8. 对SQL语句中case when...then...else...end的理解

    最近在开发中遇到一个业务想了好久写了很多代码都解决不了,最后发现一句SQL语句就能完美解决了. 是这样的,商城中各商品都有对应的市场价marketprice,存在对应的数据表里shop_goods. ...

  9. SQL语句中CASE WHEN的使用实例

    转载:https://blog.csdn.net/haiross/article/details/46412581 SQL中的CASE使用方法 Case 具有两种格式.简单 Case 函数和 Case ...

最新文章

  1. 使用 SQL Server 的 uniqueidentifier 字段类型
  2. 某程序员吐槽:女朋友老板给她包了1314元开工红包,正常吗?网友:这是绿包!...
  3. c语言运算符的语法,C语言中条件运算符的语法为
  4. 汇编原理实验 --电话簿的实现
  5. 网络知识:电脑无线网连接不上问题汇总!
  6. springboot 控制台程序读取配置文件(原创)
  7. 数据是如何被保护的?高质量存储告诉你
  8. IE, Firefox, Chrome共同的保存图片bug? 求助。
  9. SQL Server-外部联接基础
  10. 欢迎访问我的个人主页 Welcome to my home
  11. UNI-APP在iOS系统中加载来源于微信公众号的文章时(html片段),某些图片显示不出来的问题解决
  12. JAVA WEB快速入门之从编写一个基于SpringBoot+Mybatis快速创建的REST API项目了解SpringBoot、SpringMVC REST API、Mybatis等相关知识...
  13. ROS2系列知识【5】:从海龟教程开始【1】
  14. Android 九宫格布局(图片上传、预览)
  15. 命名管道的数据通信代码
  16. 关于wap上网及彩信的一点想法
  17. C# 获取MP3/WMA音频数据信息
  18. 【世界观】硅谷最重要文件:Netflix126页PPT完全汉化版
  19. 移动宽带用网速逆袭 电信宽带的危机来了吗?
  20. 2020最新Lazada开店注册流程详细介绍

热门文章

  1. 记住北京历史上的灾难
  2. 北京某打工子弟学校之二
  3. Linux-Android启动之zImage生成过程详解
  4. c 语言实例大全,c语言实例大全
  5. 树莓派python开发工具哪个好_Thonny——树莓派上Python的最新IDE
  6. jtextpane设置不能选中_在Bridge cc中不能使用camera raw 的编辑功能,解决方法
  7. php列目录设置密码,PHP输入密码并列出目录文件生成超链接代码
  8. linux服务器上svn的log_Linux服务器上搭建svn服务器
  9. php截取字符串函数 左右,php截取中文字符串函数的技巧
  10. java生成密码_java生成密码生成 | 学步园