Sql 将数据类型varchar转换为float时出错 案例 当(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar)时-地板(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar时>0和(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar时-地板(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar时)为0.25和(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar时-地板(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar)0.50和(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar)-地板(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar)0.75和(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar)-地板(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar)
假设您希望在条件的值为0时进行添加,他们会这样做:Sql 将数据类型varchar转换为float时出错 案例 当(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar)时-地板(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar时>0和(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar时-地板(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar时)为0.25和(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar时-地板(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar)0.50和(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar)-地板(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar)0.75和(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar)-地板(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar),sql,sql-server,sql-server-2008,ssrs-2008,Sql,Sql Server,Sql Server 2008,Ssrs 2008,假设您希望在条件的值为0时进行添加,他们会这样做: CASE WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))> 0 AND (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(C
CASE
WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))> 0 AND (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))<=0.25 THEN (0.25+FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))
WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))> 0.25 AND (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))<=0.50 THEN (0.50+FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))
WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))> 0.50 AND (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))<=0.75 THEN (0.75+FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))
WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))> 0.75 AND (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))<1 THEN (1+FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))
WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))= 0 THEN (0+FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))
END
AS Estimated_Effort_Days,
案例
当(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar)时-地板(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar)时=0,则
“未知号码”
当(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar)时-地板(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar时>0和(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar时-地板(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar时)为0.25和(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar时-地板(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar)0.50和(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar)-地板(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar)0.75和(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar)-地板(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar)假设您希望在条件的值为0时进行添加,他们会这样做:
CASE
WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))> 0 AND (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))<=0.25 THEN (0.25+FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))
WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))> 0.25 AND (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))<=0.50 THEN (0.50+FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))
WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))> 0.50 AND (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))<=0.75 THEN (0.75+FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))
WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))> 0.75 AND (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))<1 THEN (1+FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))
WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))= 0 THEN (0+FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))
END
AS Estimated_Effort_Days,
案例
当(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar)时-地板(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar)时=0,则
“未知号码”
当(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar)时-地板(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar时>0和(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar时-地板(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar时)为0.25和(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar时-地板(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar)0.50和(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar)-地板(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar)0.75和(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar)-地板(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar)您不能期望有一个列,其中有时值是varchar和其他时间float,因此您可以将整个结果转换为nvarchar,如:
CASE
WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))=0 THEN
"unknown number"
WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))> 0 AND (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))<=0.25 THEN (0.25+FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))
WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))> 0.25 AND (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))<=0.50 THEN (0.50+FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))
WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))> 0.50 AND (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))<=0.75 THEN (0.75+FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))
WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))> 0.75 AND (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))<1 THEN (1+FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))
WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))= 0 THEN (0+FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))
END
AS Estimated_Effort_Days,
案例
当(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar时)-地板(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar时=0
然后强制转换(“未知号码”为nvarchar)
当(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar)时-地板(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar时>0和(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar时-地板(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar时)您不能期望有一个列,其中有时值是varchar和其他时间float,因此您可以将整个结果转换为nvarchar,如:
CASE
WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))=0 THEN
"unknown number"
WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))> 0 AND (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))<=0.25 THEN (0.25+FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))
WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))> 0.25 AND (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))<=0.50 THEN (0.50+FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))
WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))> 0.50 AND (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))<=0.75 THEN (0.75+FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))
WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))> 0.75 AND (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))<1 THEN (1+FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))
WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))= 0 THEN (0+FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))
END
AS Estimated_Effort_Days,
案例
当(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar时)-地板(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar时=0
然后强制转换(“未知号码”为nvarchar)
当(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar)时-地板(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar时>0和(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar时-地板(转换(十进制(10,2)、(totaleffort/7.40))为nvarchar))为什么不只是:
CASE
WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))=0
THEN cast('unknown number' as nvarchar)
WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))> 0 AND (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))<=0.25
THEN CAST((0.25+FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar))) as nvarchar)
观察:
为什么不更改(表达式)>0和(同一表达式)为什么不只是:
CASE
WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))=0
THEN cast('unknown number' as nvarchar)
WHEN (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))> 0 AND (Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)- FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar)))<=0.25
THEN CAST((0.25+FLOOR(Cast(CONVERT(DECIMAL(10,2),(totaleffort/7.40)) as nvarchar))) as nvarchar)
观察:
为什么不更改(表达式)>0和(同一表达式)我注意到,提供的两个答案都在子句的“When”部分进行转换,而没有将比较值转换为nvarchar。这可能是您仍然看到提供的代码错误的原因
我建议您在'When'子句中单独保留数据类型(看起来'correct'比较是数字的),但是所有'Then'/'Else'结果都需要转换为字符类型,因为SQL不能在同一列中混合和匹配数据类型
只是一点额外的投入……超出了问题的范围,我意识到:-)如果这是针对报表,我建议更改报表接口,而不是更改SQL。将数据类型单独保留在视图/过程/函数级别将使数据结构更加可重用/可扩展,并且应使用零值的计算/聚合将按预期运行,而无需“反向转换”。如果必须更改SQL端而不是界面端,我建议在SQL端结构中同时包含“report pretty”和“actual value”列,这样您就不会因为删除零值和更改数据类型而丢失任何功能。我注意到,提供的两个答案都在子句的“When”部分中进行转换,而没有任何更改将比较值也转换为nvarchar。这可能就是为什么您仍然看到提供的代码出现错误的原因
我建议您在'When'子句中单独保留数据类型(看起来'correct'比较是数字的),但是所有'Then'/'Else'结果都需要转换为字符类型,因为SQL不能在同一列中混合和匹配数据类型
只是一点额外的输入…超出了问题的范围,我意识到:-)如果这是针对报表的,我建议更改报表接口,而不是更改SQL。保留数据类型