当前位置: 代码迷 >> Sql Server >> ISNULL使用有关问题
  详细解决方案

ISNULL使用有关问题

热度:68   发布时间:2016-04-24 08:52:44.0
ISNULL使用问题
若已知目标字段为数值型字段,则可使用ISNULL(目标字段,,'0') >= '3'  。
可现在目标字段的数据类型未知,需要对NULL值进行处理,
使用ISNULL(目标字段,,'') >= '3'  ,系统提示异常:从数据类型 varchar 转换为 numeric 时出错。
使用ISNULL(CAST(目标字段 AS NVARCHAR),'') >= '3',虽然系统不报错,但检索结果不对。

不知哪位遇到过此问题?



 
------解决思路----------------------
ISNULL(CAST(目标字段 AS CHAR),'') >= 3
这样试试?
------解决思路----------------------
isnull(convert(char,'字段'),0)>3
------解决思路----------------------
首先,不知道字段类型是无法写出正确的SQL的。
其次,如果字段类型是文本,但是你要用数值进行比较,应该用 ISNULL(CAST(目标字段 AS int),0) >= 3;文本比较 '10' 是小于 '3' 的,检索结果当然“不对”了。


------解决思路----------------------
引用:
(CASE WHEN 目标字段 IS NULL THEN '' ELSE 目标字段 END) >= '3'

为什么不直接 目标字段 >= '3' 呢?NULL 转为空字符串还是不符合条件啊。
引用:
使用ISNULL(CAST(目标字段 AS NVARCHAR),'') >= '3',虽然系统不报错,但检索结果不对。

如果字段类型是字符串,是否字符串长度超过30了?你 CAST 没指定长度,默认就是30,超过部分被截断了。
------解决思路----------------------
引用:
[Quote=引用:](CASE WHEN 目标字段 IS NULL THEN '' ELSE 目标字段 END) >= '3'

为什么不直接 目标字段 >= '3' 呢?NULL 转为空字符串还是不符合条件啊。
引用:
使用ISNULL(CAST(目标字段 AS NVARCHAR),'') >= '3',虽然系统不报错,但检索结果不对。

如果字段类型是字符串,是否字符串长度超过30了?你 CAST 没指定长度,默认就是30,超过部分被截断了。
正解!没必要加ISNULL
------解决思路----------------------
不会错啊,数值自动转化为0了
;WITH a(nCol,sCol) AS (
    SELECT 1,'1' UNION ALL
    SELECT 3,'3' UNION ALL
    SELECT 10,'10' UNION ALL
    SELECT NULL,NULL
)
,b AS (
    SELECT nCol, (CASE WHEN nCol IS NULL THEN '' ELSE nCol END) nCol2,
           sCol, (CASE WHEN sCol IS NULL THEN '' ELSE sCol END) sCol2
      FROM a
)
SELECT * FROM b

       nCol       nCol2 sCol sCol2
----------- ----------- ---- -----
          1           1 1    1
          3           3 3    3
         10          10 10   10
       NULL           0 NULL