`

IsNull 和 SQL语句中CASE WHEN用法

    博客分类:
  • SQL
阅读更多

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= 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 时以 '办理中' 替代表示
                   。。。。。。

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

分享到:
评论

相关推荐

    SQL Server中Case 的不同用法

    在SQL Server中,CASE表达式是一种强大的工具,用于在查询中进行条件判断和逻辑操作。它的功能远不止创建新字段那么简单,而是可以在多个方面...通过熟练掌握CASE的用法,你可以更好地理解和操纵SQL Server中的数据。

    sql数据库 转 Access SQL语句改写之 Case When Then When Then Else End

    ### SQL数据库转Access SQL语句改写:Case When Then When Then Else End #### 知识点一:SQL CASE WHEN THEN 结构与Access IIF及SWITCH函数对比 在进行SQL到Access SQL的转换过程中,一个重要的知识点是了解如何...

    SQL中case语法的使用

    除了上述的基本用法之外,`CASE`语句还可以在更复杂的场景中发挥作用,比如动态生成列名、条件筛选等。 ##### 示例3: 动态列名 有时我们需要根据某些条件动态生成列名,这可以通过嵌套`CASE`语句实现: ```sql ...

    PB脚本中SQL语句写法与SQL中语句写法对照

    PB脚本中SQL语句写法与SQL中语句写法对照是非常重要的知识点,因为PB脚本和SQL语言在写法和应用中有所不同。本文将对PB脚本中SQL语句写法和SQL中语句写法进行对比和分析。 一、Setfilter()函数中条件写法 在PB脚本...

    oracle where case when where后面跟case when

    WHERE salary &gt; (CASE WHEN AVG(salary) IS NOT NULL THEN AVG(salary) ELSE 0 END); ``` 在这个例子中,`CASE WHEN`语句检查平均薪资是否为`NULL`,如果不是,则使用平均薪资作为比较值;如果是`NULL`,则使用0。 ...

    用于生成数据字典的SQL语句

    CASE WHEN a.colorder = 1 THEN isnull(f.value, '') ELSE '' END AS 表说明, a.colorder AS 字段序号, a.name AS 字段名, CASE WHEN COLUMNPROPERTY(a.id, a.name, 'IsIdentity') = 1 THEN '√' ELSE '' END AS ...

    MSSQL性能监控SQL语句

    本文将深入探讨MSSQL性能监控中的几个关键SQL语句,帮助数据库管理员(DBA)和开发者更好地理解和管理MSSQL的性能。 ### 1. sys.dm_exec_query_stats:查询统计信息 `sys.dm_exec_query_stats`是MSSQL中一个非常...

    SQL语句大全(很全)sql语句用法

    SQL(Structured Query Language)是用于管理和操作关系数据库的语言。...以上就是SQL语句的主要用法,涵盖了从基础的数据查询到复杂的数据库管理操作。理解并熟练掌握这些语句对于有效地管理数据库至关重要。

    开发常用的SQL语句

    在给定的部分内容中,我们看到一个复杂的SELECT语句,其中包含了CASE WHEN语句和多种SQL函数,如COLUMNPROPERTY、ISNULL等,这体现了SQL的强大和灵活性。此语句主要目的是从系统表`syscolumns`和其他相关系统表中...

    sql判断语句.txt

    通过对SQL中的CASE语句进行详细的介绍和实例分析,我们可以看到CASE语句的强大功能和灵活性。正确地使用CASE语句不仅可以简化复杂的条件判断逻辑,还能提高查询的可读性和可维护性。无论是初学者还是有经验的开发...

    sql 中 case when 语法使用方法

    在SQL语言中,`CASE WHEN`语句是一个非常强大的逻辑判断工具,它可以替代C语言中的`switch case`结构,提供灵活的数据处理和条件判断。在SQL查询中,`CASE WHEN`常常用于根据不同的条件返回不同的值,或者在`SELECT`...

    SQL 语句存储过程

    表说明=case when a.colorder=1 then isnull(f.value,'') else '' end, 字段序号=a.colorder, 字段名=a.name, 标识=case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '√'else '' end, 主键=case when ...

    在SQL语句如何获得MSSQLSERVER登录用户和密码

    sysusers 系统视图包含了 SQL Server 实例中的所有登录用户信息,可以使用以下语句来获取登录用户和密码: ``` SELECT name, password FROM sysusers WHERE name = USER_NAME() ``` 五、穷举法破解 SQL Server ...

    sql学习之CASE WHEN THEN ELSE END的用法

    总之,`CASE WHEN THEN ELSE END`是SQL中非常重要的逻辑处理工具,它可以灵活地处理复杂的数据筛选和转换,使得SQL查询更具灵活性和功能性。无论是在Access、SQL Server还是SQLite中,这一结构都是不可或缺的一部分...

    SQL_Server,Oracle,DB2数据库SQL语句比较

    标题与描述均聚焦于SQL Server, Oracle, 和DB2数据库中的SQL语句比较,这是一个对IT专业人士特别是数据库管理员(DBA)、开发人员以及对数据库技术感兴趣的人来说极为实用的主题。以下是对给定文件中提及的关键知识点...

    Transact-SQL语句

    SELECT SNo, Cno, Score = CASE WHEN Score IS NULL THEN '未录入' WHEN Score 不及格' WHEN Score &gt;= 60 AND Score 及格' WHEN Score &gt;= 70 AND Score 良好' WHEN Score &gt;= 90 THEN '优秀' END FROM SC;...

    经典SQL语句大全

    select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type 显示结果: type ...

    一个sql语句,包含有几乎所有标准查询语法

    在给定的SQL语句中,虽然没有直接的WHERE子句,但在子查询和CASE WHEN表达式中可以看到条件过滤的使用,例如: - `(KMC101.KMC101_TYPE = "BUDGETCODE") AND (KMC101.KMC101_CODE = SUBSTRING(KMM102.KMM102_BGT_...

    sql语句获取数据库中的数据库表列.doc

    (CASE WHEN PKeyCol.COLUMN_NAME IS NULL THEN '' ELSE 'PK' END) + ... ``` 这条语句将返回表中所有字段的信息,包括主外键、字段名、数据类型、字段长度和列说明。 此外,我们还可以使用以下 SQL 语句获取用户...

    经典sql语句,关联到四张表,非常经典

    CASE WHEN 语句用于在 SQL 查询中创建条件 (如果...那么...) 语句。它可以用于计算和返回基于某些条件的结果。在例子中,可以看到CASE WHEN 语句用于处理可能为零的情况,避免除以零的错误: ```sql CASE WHEN sbzs ...

Global site tag (gtag.js) - Google Analytics