我使用强制转换或转换进行了一些搜索,但未能成功完成查询。
这是我现在的查询
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.
很抱歉,可能有人多次问到这个问题,如果有人可以解释我做错了什么或将我指向正确的方向,我将不胜感激。
答案 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
表达式仅返回一种数据类型,并且它尝试将所有WHEN
和ELSE
分支的结果转换为该数据类型。选择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