"Error converting data type varchar to float":如何在SQL查询中解决此错误?



我使用的是SQL Server 2014,我有以下T-SQL查询:

USE MyDatabase
;with cte1 as (    
SELECT ID, Name, Age
from [Table1]    
Where ([Age] is NOT NULL OR [Age] >= 18)
),    
cte2 as 
(
Select *,    
(case when [Age] between 18 and 24 then '18 - 24'
when [Age] between 25 and 35 then '25 - 35'
when [Age] between 36 and 45 then '36 - 45'
when [Age] between 46 and 55 then '18 - 24'
when [Age] between 56 and 65 then '18 - 24'
when [Age] > 65 then 'Above 65'
ELSE [Age]
END) as [Age Group]    
from [cte1]    
)    
SELECT *
from [cte2]

当我运行上面的代码时,我得到以下错误:

将数据类型varchar转换为float时出错。

我知道这个错误与我的[Age]case expression有关,因为当我从查询中删除该case expression时,它运行良好。

注意:我的表中的[Age]列的类型为float,并且包含NULL。

我已经尝试了这里提供的答案,但仍然收到相同的错误消息:将数据类型varchar转换为float 时出错

我怎样才能避免这个错误?

一个case表达式需要所有返回类型都相同。你把绳子和浮子弄混了。将浮点转换为字符串,它就可以工作了。

CASE WHEN [Age] BETWEEN 18 AND 24 THEN '18 - 24'
WHEN [Age] between 25 and 35 THEN '25 - 35'
WHEN [Age] between 36 and 45 THEN '36 - 45'
WHEN [Age] between 46 and 55 THEN '18 - 24'
WHEN [Age] between 56 and 65 THEN '18 - 24'
WHEN [Age] > 65 THEN 'Above 65'
-- Conversion required here
ELSE CONVERT(VARCHAR(12), [Age])
END AS [Age Group]

注意:我认为你的查询比你发布的要多,否则没有理由有2个CTE。

CASE表达式混合了不同类型的结果,浮点和文本。这在SQL中不起作用,因为每个查询/语句都必须返回一个类型。

SQL Server将尝试使用数据类型优先级规则将所有值转换为单个类型,更喜欢更具体的类型,而不是更通用的类型。float的优先级高于varchar,因此服务器将尝试将所有值强制转换为float并失败。

ELSE子句将不得不返回varchar,例如:

ELSE cast(Ages as varchar(4))

最新更新