从数据类型 varchar 转换为 numeric 时出错 了解 nullif,isnumeric,convert 用法
时间:2011-04-26 来源:步行者-朱化君
今天第一次写博客,也不知道从哪里开始写,反正就想写什么就写什么吧。
就是这么一张表,主要列
这三列分别是,比例系数1,比例系数2,比例系数3 ,这是已经存在的数据表,很郁闷,都是字符型,并且允许为空,
我要做的就是将其转换为decimal 类型,在客户输入数据的时候,客户还是比较自觉的,要么点一下,要么不输入
保存的时候,就有可能保存为 null 或者就是一个 '' 下面是转换的方法. ,如果是 null 和 '' 就要转换为 0
第一步: 要将保存为 '' 的转换为 null 下面以 bl 为例,bl 是比例系数
nullif(bl,'')
通过nullif 方法可以匹配当bl 为 '' 时 返回 null 当 bl 不为 '' 时 返回bl 值,记住 bl 是 null 的时候会报错的.
所以在进行转换的时候要先判断 bl 是不是 null ,方法当然是 isnull(bl,0) 如果bl 是null 的话就转换为 0,
所以应该这样写 nullif(isnull(bl,0),'')
第二步:将第一步转换的值在进行是否为 null 的转换,如果是 null 就转换为 0
方法当然是 isnull(nullif(isnull(bl,0),''),0)
第三步:保证为 null,'' 的都可以进行varchar 到 decimal 转换了
方法是 : convert(decimal(18,6),isnull(nullif(isnull(bl,0),''),0)) 就是将第二步得到的值转换为 decimal(18,6) 类型,18 代表长度,6代表小数长度
到这里可不是就完善了,作为程序员,我们要不让出错下面就要用到 isnumeric
isnumeric 是如果是可以转换为数字则值为 1,不能转换为数字 值为0
第四步: 判断是否可以转换为数字 ,判断第二步中的值是否可以转换为数字
isnumeric(isnull(nullif(isnull(bl,0),''),0))
第五步:整合起来
select convert(decimal(18,6),isnull(nullif(isnull(bl,0),''),0)) from 表 where isnumeric(isnull(nullif(isnull(bl,0),''),0))=1