数据库:sqlserver;
错误案例:(status为int类型)select *,(case status when 0 then '正常' when 1 then '删除' else status end) as status from tb;
错误信息:在将 varchar 值 '正常' 转换成数据类型 int 时失败。
原因分析:简单来说,不同类型数值不能转换。按照“数据类型优先级”规则,case表示式中最高优先级的数据类型决定了表达式返回值的数据类型。“数据类型优先级”规则可以在SQL Server Books Online(BOL)找到,它规定了int数据类型的优先级要比nvarchar数据类型高。
解决思路:case when then配合cast/convert,先将int类型转换成varchar类型。
cast/convert:将某种数据类型的表达式显式转换为另一种数据类型。例:cast(status as varchar(64)),将int类型的status转换成varchar类型;
解决方法:select a.* ,(case a.status when 0 then '正常' when 1 then '删除' else a.status end) as status from
(select *,cast(status as varchar(64)) status from tb) a;