isnull(字段1,字段2)和case when 字段1 is null then 字段2 else 字段1 end 的不同之处

by zhengyj 2012.5.8 14:56

注:脚本执行有风险,对于客户正式环境请在研发指导下执行。

先来看一下 MSSQL中isnull的用法 [以下资料来自网路]

在程序开发过程中,程序员用到最多的估计就是数据库了,几乎在任何一个地方都会和数据库打交道,数据库的增加,删除,更新,查询,都必须用到sql语句或者是存储过程,归根结底还是试用sql数据库,但是在敲写相关sql语句时,我们经常会遇到一些空的字符串或者是字段,这就给我们对数据库造成一定的麻烦,系统经常会提示“某值null不能转换”“插入的值不能为空”等等诸如此类的提示,isnull函数会帮助你搞定这些小菜。

Isnull 函数主要作用是将为空的值替换为指定值,如果不为空返回检查类型的返回值,isnull的语法:

Isnull check_expression , replacement_value

参数check_expression ,是待检查是否为空的表达式,参数replacement_value是带替换的指定值,如果参数check_expression为空则参数replacement_value进行填充,如果check_expression不为空,则返回表达式相应的返回值类型,需要注意到是参数check_expression和参数replacement_value的类型需要保持一致,否则要进行相应的转换,下面通过实例说话,

例一:

select isnull(studentid,100) from student_info

解释:这个实例的意思就是查出student_info表中字段为studentid的值,如果字段studentid值为空就在字段studentid中添加100,或者你可以动态的向这个空字段添加值。

private int GetNewBillID()

{

string sql ="select isnull(max(FBillId),0) from Vs_ICChange";

int id = Convert.ToInt32(sh.QueryValue(sql));

if (id == 0)

{

return 1000;

}

else

{

return id + 1;

}

}

这个私有方法就是查询表Vs_ICChangeFBillId字段,如果FBillId字段为空就换值为0,通过执行语句得到数值id,在对id数据进行判断,如果id=0,直接返回id=1000,如果id已经有数值的话,直接在原来的基础上加一,再将返回的id数值之间插入到相关FBillId字段即可,比如:

Insert into Vs_ICChangeFBillId values(‘”+id+”’);

这样就可以在没有数值的字段让字段值实现人工自增,从而程序就不会报错。

例二:

use test1

  insert into a(name,score)

  select name,isnull(score,100) from b

解释:从表b中查出相关数据,然后插入到表a,如果表b中的score字段为空,则放入数值100,并插入到a表中。

我想举例和证明的是isnull(null字段,decimal字段)是怎样进行数据类型转换的

create table table1 (id int,code varchar,ids decimal(38,9))
insert table1 values (1,'a',12.1212)
insert table1 values (2,'b',13.5555)

select t1.id,'g' as code1,null as money1
into table2
from table1 as t1

select * from table1
select * from table2


select
--*
ISNULL(t2.money1,t1.ids) as isnullvalue
,case when t2.money1 is null then t1.ids else t2.money1 end as casewhenValuse
,ISNULL(CONVERT(decimal(38,9),t2.money1),t1.ids) as 处理后的值
from table1 as t1
full outer join table2 as t2
on t1.id = t2.id and t1.code = t2.code1

最后一段sql执行的结果为:
isnullvalue casewhenValuse 处理后的值
12        12.121200000       12.121200000
13        13.555500000       13.555500000
NULL         NULL             NULL
NULL         NULL               NULL

isnull(null字段,decimal字段)是怎样进行数据类型转换的:

在最后的sql中,t2.money1字段在表table中始终为null,通过select null as
null字段,* into talbe2 的形式创建的表,null字段默认的数据类型为int。

在isnull(null字段,decimal字段)函数中,null字段为null,decimal字段数据类型被
转换为int,导致decimal字段的小数部分都被舍弃。

但是case when 字段1 is null then 字段2 else 字段1 end 这样形式不存在数据类型转换。
这也是isnull和case when的区别。

评论 (3) -

hs wrote at 2012/5/8 15:12:23 #

按照以往的工作经验isnull函数更经常的用在判断某个字段是否>0或者是否为空
isnull(col,0)>0 判断该数值类型字段是否大于零考虑该字段值可能为Null
isnull(col,'')<>'' 判断该字符串类型字段是否有值考虑该字段值可能为Null

isnll是写sql的时候常用的函数为了确保逻辑的严密性微笑

hbzhang wrote at 2012/5/8 16:25:38 #

以前做程序时,习惯性地一看到需要做IsNull处理的地方,就回头看看表设计时是否可以改为非空 + 默认值的方式。慢慢地,一开始设计表的时候,就注意避免掉这个问题。

zhanggangb wrote at 2012/5/24 10:33:04 #

zhengyujin这个问题总结的好。之前一直以为Isnullt 和case when是通用的。所以之前给你出的方案,也给你带来了困扰。呵呵。

添加评论



biuquote
微笑得意调皮害羞酷大笑惊讶发呆喜欢可怜尴尬闭嘴噘嘴皱眉伤心抓狂呕吐坏笑漫骂发怒
Loading


RecentComments

评论 RSS

Statistics

989 篇文章
0 个单页
652918 条评论
11 次评分
248911 次访问
访问统计开始于 2019年12月15日
平均日访问 5531 次
当前 108 人在线