IsNull 和 SQL语句中CASE WHEN用法

 【转】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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264286.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

好玩的代码(1)

看效果&#xff08;gif工具不太会用&#xff0c;效果不是很好&#xff09; 代码很简单&#xff0c;就是对sleep函数和/b的使用。 代码 1 #include <cstdio>2 #include <windows.h>3 using namespace std;4 5 int main(int argc, char **argv)6 {7 printf("…

Python基础实践-密码管理系统实例

密码管理系统实例 需求分析&#xff1a; 1.主界面&#xff08;选项&#xff1a;密码生成&#xff0c;密码查询&#xff0c;密码修改&#xff0c;密码删除&#xff09;2.密码生成&#xff1a;用户输入密码的描述&#xff0c;输入密码的长度&#xff0c;使用随机数生成一个比较复…

设计模式?!

如何解决复杂性 分解 人们面对复杂性有一个常见的做法&#xff1a;即分而治之&#xff0c;将大问题分解为多个小问题&#xff0c;将复杂问题分解为多个简单问题。 抽象 更高层次来讲&#xff0c;人们处理复杂性有一个通用的技术&#xff0c;即抽象。由于不能掌握全部的复杂对象…

html循环加载多个图片,两行代码实现图片碎片化加载

今天来实现一个图片碎片化加载效果&#xff0c;效果如下&#xff1a;我们分为 3 个步骤来实现&#xff1a;定义 html 结构拆分图片编写动画函数定义 html 结构这里只需要一个 canvas 元素就可以了。id"myCanvas"width"900"height"600"style"…

从今开始,好好学习一下算法!

ACM 进阶之路&#xff08;转&#xff09;2007年12月30日 星期日 18:20一般要做到50行以内的程序不用调试、100行以内的二分钟内调试成功.ACM主要是考算法的,主要时间是花在思考算法上&#xff0c;不是花在写程序与debug上。 下面给个计划你练练&#xff1a; 第一阶段&#xff1…

Redis(1) 简介以及linux环境下的安装

一、简介 Redis是个啥&#xff1f;它是一个key-value型的数据库&#xff0c;它是一个内存性的数据库&#xff0c;数据大量放在内存中&#xff0c;所以速度非常快&#xff0c;快到可以用来当缓存。当然它也有持久化的功能&#xff0c;可以把数据以文件的形式存在硬盘上&#xff…

premature end of file错误

在EClipse环境中变下android程序 在LayOut文件夹中建立了一个性文件new.xml 然后把main.xml的内容复制去new.xml 就提示错误"premature end of file"这是怎么回事保存一下就行了。转载于:https://blog.51cto.com/net5x/1562569

谈*静态页*(或网页*静态化*)的时候,请区分一些概念(转)

http://www.cnblogs.com/JeffreyZhao/archive/2009/07/05/talk-about-page-statilization.html “静态页”&#xff0c;在Web应用程序开发中是很常见的概念。只是我发现目前还是有相当部分的朋友&#xff0c;在这方面的存在一定的误区。因此现在独立写一篇文章&#xff0c;也想…

201671010435-王潇-实验四附加实验-项目互评

实验要求对项目博文作业进行阅读并进行评论评论要点包括&#xff1a;博文结构、博文内容、博文结构与PSP中“任务内容”列的关系、PSP中“计划共完成需要的时间”与“实际完成需要的时间”两列数据的差异化分析与原因探究。 克隆结对方项目源码到本地机器&#xff0c;利用实验提…

html form src,form.html

Amaze UI Admin index Examples欢迎你, Amaze UI 43小时前夕风色Amaze UI 的诞生&#xff0c;依托于 GitHub 及其他技术社区上一些优秀的资源&#xff1b;Amaze UI 的成长&#xff0c;则离不开用户的支持。 2016-09-21 下午 16:405天前禁言小张为了能最准确的传达所描述的问题&…

【转】删除已经存在的 TFS Workspace

删除已经存在的 TFS Workspace 分类&#xff1a; TFS2010-03-03 16:59 1239人阅读 评论(2) 收藏 举报serverpathcommandcachefilegoogle工作转移到新的TFS平台打开source control在创建workspace时出错信息为&#xff1a;The Path <local path> is already mapped in wor…

tiny4412--linux驱动学习(2)

在ubuntu下编写验证字符设备驱动 并移植到arm开发板上 1&#xff0c;准备工作 uname -r 查看电脑版本信息 apt-get install linux-source 安装相应版本的linux内核2&#xff0c;编写驱动程序 Global CharDev.c /* GlobalCharDev.c */ #include <linux/module.h>…

SQL操作全集

SQL操作全集 SQL操作全集 下列语句部分是Mssql语句&#xff0c;不可以在access中使用。 SQL分类&#xff1a; DDL—数据定义语言(CREATE&#xff0c;ALTER&#xff0c;DROP&#xff0c;DECLARE) DML—数据操纵语言(SELECT&#xff0c;DELETE&#xff0c;UPDATE&#xff0c;INSE…

osx doc to html,macos – 在OSX上安装Git HTML帮助

从中更改克隆命令地址$sudo git clone git://git.kernel.org/pub/scm/git/git.git git-doc --branch html至$sudo git clone git://git.kernel.org/pub/scm/git/git-htmldocs.git git-doc希望很快就会在Github教程中进行更改.更新&#xff1a;如果您是认为使用Xcode 4提供Apple…

select poll使用

select poll使用 2.1. 怎样管理多个连接&#xff1f;“我想同一时候监控一个以上的文件描写叙述符(fd)/连接(connection)/流(stream)&#xff0c;应该怎么办&#xff1f;” 使用 select() 或 poll() 函数。 注 意&#xff1a;select() 在BSD中被引入&#xff0c;而poll()是Sy…

如何用distinct消除重复记录的同时又能选取多个字段值?

如何用distinct消除重复记录的同时又能选取多个字段值&#xff1f; 需求是&#xff1a;我要消除name字段值重复的记录&#xff0c;同时又要得到id字段的值&#xff0c;其中id是自增字段。 select distinct name from t1 能消除重复记录&#xff0c;但只能取一个字段&#xf…

学计算机需要多少内存,电脑内存多大才够用

现在内存的价钱越来越便宜&#xff0c;很多新装机的朋友都已经在使用1GB的内存&#xff0c;而还有很多人也在给老电脑的内存升级。在升级了物理内存之后&#xff0c;如何有效设置虚拟内存才能获得最大限度的性能提升?网上流传的一些优化虚拟内存的方法真的有效吗?下面学习啦小…

2019十二省联考游记

这次省选真的经历了很多&#xff0c;虽然最后一波三折进了省队&#xff0c;但还是留下了许多遗憾。 DAY1 进考场先看T1&#xff0c;区间线性基&#xff1f;想了想大概像超级钢琴那样做&#xff1f;但trie树上怎么查区间第k大&#xff1f;一时间没想出来。咦&#xff01;暴力60分…

Android开发学习笔记-自定义对话框

系统默认的对话框只能显示简单的标题内容以及按钮&#xff0c;而如果想要多现实其他内容则就需要自定义对话框&#xff0c;下面是自定义对话框的方法。 1、先定义对话框的模版 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:andro…

TreeView控件二(递归算法)

扩展了一下。每个控件都有其独特的写法和用法&#xff0c;treeview就是这样的一个控件。做个类似资源管理器的页面。如果逐层遍历&#xff0c;代码会不断重复&#xff0c;所以这时需要用递归算法 Codepublic static void TreeBindMethod(TreeView tvFile,string target) …