将smallint转换为varchar

时间:2019-02-08 18:30:40

标签: sql sql-server

我使用强制转换或转换进行了一些搜索,但未能成功完成查询。

这是我现在的查询

CASE WHEN ENR.GR = '-1' THEN 'TK'
WHEN ENR.GR = '0' THEN 'K'
ELSE ENR.GR
END AS 'Grade'

我尝试使用case并进行如下转换:

CASE WHEN ENR.GR = '-1' THEN CAST('TK' as varchar(2))
WHEN ENR.GR = '0' THEN CAST('K' as varchar(1))
ELSE ENR.GR
END AS 'Grade'

我没有获得

就无法运行它
"Conversion failed when converting the varchar value 'TK' to data type 
smallint." error.

很抱歉,可能有人多次问到这个问题,如果有人可以解释我做错了什么或将我指向正确的方向,我将不胜感激。

3 个答案:

答案 0 :(得分:2)

您的对话应包含ELSE部分:

CASE WHEN ENR.GR = '-1' 
     THEN 'TK'
     WHEN ENR.GR = '0' 
     THEN 'K'
     ELSE CAST(ENR.GR AS VARCHAR(255))
END AS 'Grade'

您不需要使用带数字的单引号。只需使用:

CASE WHEN ENR.GR = -1
     THEN 'TK'
     WHEN ENR.GR = 0
     THEN 'K'
     ELSE CAST(ENR.GR AS VARCHAR(255))
END AS 'Grade'

答案 1 :(得分:1)

假设gr列为smallint,则需要将其强制转换为varchar:

CASE
    WHEN ENR.GR = -1 THEN 'TK'
    WHEN ENR.GR =  0 THEN 'K'
    ELSE CAST(ENR.GR AS VARCHAR(6))
END AS 'Grade'

这是因为CASE表达式仅返回一种数据类型,并且它尝试将所有WHENELSE分支的结果转换为该数据类型。选择based on precedence作为结果数据类型。由于smallint的优先级高于varchar,因此它将尝试将'DK'和'K'转换为smallint。

答案 2 :(得分:0)

您需要将smallint强制转换为varchar。

DECLARE @gr smallint = -1;

SELECT 
    CASE WHEN @gr = '-1' THEN 'TK' ELSE CASE WHEN @gr = '0' THEN 'K' ELSE CAST(@gr AS VARCHAR(10)) END END AS Grade