积极答复者
bigint字段,在case中转成字符报错

问题
-
sql2005,maxcallcount字段为bigint,要求值>60时拼接字符串
case when maxcallcount>=60 then '<font color=red>'+CONVERT(VARCHAR(50),maxcallcount)+'</font>' else maxcallcount END
报错:从数据类型 varchar 转换为 bigint 时出错。
无论怎么都不往字符串转,试了cast也不行
可以只看下面,@a一定为int,如何能正常运行
__________________________________________________________________________________________
DECLARE @a int;
SET @a=70
SELECT case when @a>=60 then '大于60'+CONVERT(VARCHAR(50),@a) else @a END- 已编辑 孤单一吻 2013年12月3日 6:22 有人说看不懂,换个表达方式
答案
-
测试了一下
--------------------------------------------------- --测试一: DECLARE @maxcallcount BIGINT SET @maxcallcount = 70 SELECT CASE WHEN @maxcallcount >= 60 THEN 'fgdg' ELSE '<font color=red>' + CONVERT(VARCHAR(50), @maxcallcount) + '</font>' END --结果 ------------------------------------------------------------------------- fgdg (1 行受影响) ------------------------------------------------------------------ --测试二: DECLARE @maxcallcount BIGINT SET @maxcallcount = 70 SELECT CASE WHEN @maxcallcount >= 60 THEN 23 ELSE 66 END --结果 ----------- 23 (1 行受影响) ---------------------------------------------------------------- --测试三: DECLARE @maxcallcount BIGINT SET @maxcallcount = 70 SELECT CASE WHEN @maxcallcount >= 60 THEN 'fgdg' ELSE 22 END --结果 ----------- 消息 245,级别 16,状态 1,第 3 行 在将 varchar 值 'fgdg' 转换成数据类型 int 时失败。 ---------------------------------------------------------- --测试四: DECLARE @maxcallcount BIGINT SET @maxcallcount = 70 SELECT CASE WHEN @maxcallcount >= 60 THEN 66 ELSE '535' END --结果 ----------- 66 (1 行受影响) ---------------------------------------------------------------
我发现如下规律:当then后面是字符类型,else后面是int或者bigint 就会出现:
消息 245,级别 16,状态 1,第 3 行
在将 varchar 值 'fgdg' 转换成数据类型 int 时失败。当then后面是int或者bigint 而else后面是字符类型则不会报错
优先级以int为先
- 已标记为答案 Michelle GeModerator 2013年12月11日 8:08
全部回复
-
楼主对 CASE 的理解不够
http://msdn.microsoft.com/zh-cn/library/ms181765.aspx
返回类型
result_expressions 和可选 else_result_expression 的类型集中返回优先级最高的类型。</sentencetext> 数据类型优先级 (Transact-SQL)。</sentencetext>
在你的表达式中,优先级高的数据类型是 else 部分,也就是 bigint/int, 所以 when 部分的结果类型要转换为 bigint/int, 根据你的写法,这个转换很显然不会成功的
-
我跟邹建大侠的意见有些出入
“优先级高的数据类型是 else 部分”
我觉得无论是then部分还是else部分 ,当返回的表达式涉及到两个数据类型时候,
以优先级最高的那个数据类型为标准
DECLARE @maxcallcount BIGINT SET @maxcallcount = 70 SELECT CASE WHEN @maxcallcount >= 90 THEN @maxcallcount ELSE '<font color=red>' + CONVERT(VARCHAR(50), @maxcallcount) + '</font>' END
在COALESCE (Transact-SQL)语句里也有相关解释
http://msdn.microsoft.com/zh-cn/library/ms190349.aspx
比较 COALESCE 和 ISNULL
ISNULL 函数和 COALESCE 表达式的用途类似,但行为可能有所不同。
由于 ISNULL 是函数,将仅对其计算一次。 如上所述,COALESCE 表达式的输入值可能会计算多次。
所得表达式数据类型的确定方式是不同的。 ISNULL 使用第一个参数的数据类型,而 COALESCE 遵循 CASE 表达式规则并返回具有最高优先级的值的数据类型。
ISNULL 和 COALESCE 的验证也是不同的。 例如,ISNULL 的 NULL 值将会转换为 int,而对于 COALESCE,则必须提供数据类型。
同上面语句可以推测int的优先级是比较高的
-
测试了一下
--------------------------------------------------- --测试一: DECLARE @maxcallcount BIGINT SET @maxcallcount = 70 SELECT CASE WHEN @maxcallcount >= 60 THEN 'fgdg' ELSE '<font color=red>' + CONVERT(VARCHAR(50), @maxcallcount) + '</font>' END --结果 ------------------------------------------------------------------------- fgdg (1 行受影响) ------------------------------------------------------------------ --测试二: DECLARE @maxcallcount BIGINT SET @maxcallcount = 70 SELECT CASE WHEN @maxcallcount >= 60 THEN 23 ELSE 66 END --结果 ----------- 23 (1 行受影响) ---------------------------------------------------------------- --测试三: DECLARE @maxcallcount BIGINT SET @maxcallcount = 70 SELECT CASE WHEN @maxcallcount >= 60 THEN 'fgdg' ELSE 22 END --结果 ----------- 消息 245,级别 16,状态 1,第 3 行 在将 varchar 值 'fgdg' 转换成数据类型 int 时失败。 ---------------------------------------------------------- --测试四: DECLARE @maxcallcount BIGINT SET @maxcallcount = 70 SELECT CASE WHEN @maxcallcount >= 60 THEN 66 ELSE '535' END --结果 ----------- 66 (1 行受影响) ---------------------------------------------------------------
我发现如下规律:当then后面是字符类型,else后面是int或者bigint 就会出现:
消息 245,级别 16,状态 1,第 3 行
在将 varchar 值 'fgdg' 转换成数据类型 int 时失败。当then后面是int或者bigint 而else后面是字符类型则不会报错
优先级以int为先
- 已标记为答案 Michelle GeModerator 2013年12月11日 8:08
-
******************************************************************************************************************
确如 桦仔 说的
我在该条语句中我把要用到@a int的地方,全转成varchar解决了
有劳各位 :)
LZ,您把这个也收藏吧,对您有用的