none
bigint字段,在case中转成字符报错 RRS feed

  • 问题

  • 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 有人说看不懂,换个表达方式
    2013年12月3日 3:13

答案

  • 测试了一下

    ---------------------------------------------------
    --测试一:
    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为先

    2013年12月4日 4:02

全部回复

  • But error says can't convert varchar to bigint, which way you tried to go?
    2013年12月3日 3:40
  • 楼主对 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, 根据你的写法,这个转换很显然不会成功的

    2013年12月3日 9:10
  • 我跟邹建大侠的意见有些出入

    “优先级高的数据类型是 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的优先级是比较高的

    2013年12月3日 11:49
  • 不要断章取议,我说的是“在你的表达式中,优先级高的数据类型是 else 部分”,有前提的

    2013年12月4日 1:03
  • Case 里的值的类型都不一样嘛,ELSE后面是INT,前面是字符。。。属开发代码问题,非工具平台问题


    Try SQL Server 2008 QQ:315054403 dgdba@hotmail.com

    2013年12月4日 2:05
  • 测试了一下

    ---------------------------------------------------
    --测试一:
    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为先

    2013年12月4日 4:02
  • 不要断章取议,我说的是“在你的表达式中,优先级高的数据类型是 else 部分”,有前提的

    不好意思,邹建大侠误会您了

    2013年12月4日 4:05
  • ******************************************************************************************************************

    确如 桦仔 说的

    我在该条语句中我把要用到@a int的地方,全转成varchar解决了

    有劳各位 :)

    2013年12月5日 1:25
  • ******************************************************************************************************************

    确如 桦仔 说的

    我在该条语句中我把要用到@a int的地方,全转成varchar解决了

    有劳各位 :)

    LZ,您把这个也收藏吧,对您有用的

         数据类型优先级 (Transact-SQL)

    2013年12月5日 1:32