"Error converting data type varchar to float":如何解决我的 SQL 查询中的这个错误?
"Error converting data type varchar to float": how to get around this error in my SQL query?
我正在使用 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]
当我运行上述代码时,出现以下错误:
Error converting data type varchar to float.
我知道错误与我的 [年龄] case expression
有关,因为当我从查询中删除 case expression
时,它 运行 没问题。
注意:我的 table 中的 [Age] 列的类型为 float
并且包含 NULL。
我已经尝试了此处提供的答案,但仍然收到相同的错误消息:Error converting data type varchar to float
如何解决这个错误?
case 表达式需要所有 return 类型都相同。你混淆了字符串和浮点数。将浮点数转换为字符串即可。
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
表达式混合了不同类型的结果,float 和 text。这在 SQL 中不起作用,其中每个 query/statement 必须 return 一种类型。
SQL 服务器将尝试使用 Data type precedence 规则将所有值转换为单一类型,优先选择更具体的类型而不是更通用的类型。 float
的优先级高于 varchar
,因此服务器将尝试将所有值转换为 float
并失败。
ELSE
子句必须 return 一个 varchar
代替,例如:
ELSE cast(Ages as varchar(4))
我正在使用 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]
当我运行上述代码时,出现以下错误:
Error converting data type varchar to float.
我知道错误与我的 [年龄] case expression
有关,因为当我从查询中删除 case expression
时,它 运行 没问题。
注意:我的 table 中的 [Age] 列的类型为 float
并且包含 NULL。
我已经尝试了此处提供的答案,但仍然收到相同的错误消息:Error converting data type varchar to float
如何解决这个错误?
case 表达式需要所有 return 类型都相同。你混淆了字符串和浮点数。将浮点数转换为字符串即可。
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
表达式混合了不同类型的结果,float 和 text。这在 SQL 中不起作用,其中每个 query/statement 必须 return 一种类型。
SQL 服务器将尝试使用 Data type precedence 规则将所有值转换为单一类型,优先选择更具体的类型而不是更通用的类型。 float
的优先级高于 varchar
,因此服务器将尝试将所有值转换为 float
并失败。
ELSE
子句必须 return 一个 varchar
代替,例如:
ELSE cast(Ages as varchar(4))