3

在 SO 上搜索和搜索,但无法弄清楚
尝试将每个字段转换为 FLOAT 无济于事,转换没有进一步帮助我
如何获得以下 case 子句以返回 THEN 部分中所述的值?

错误:消息 8114,级别 16,状态 5,第 1 行将数据类型 varchar 转换为浮点数时出错。

我的 SQL 查询部分使它出错:

When cust_trendd_w_costsv.terms_code like '%[%]%' and (prod.dbo.BTYS2012.average_days_pay) - (substring(cust_trendd_w_costsv.terms_code,3,2)) <= 5 THEN prod.dbo.cust_trendd_w_costsv.terms_code

average_days_pay = 浮动
terms_code = char

干杯!

4

3 回答 3

9

尝试使用ISNUMERIC处理无法转换的字符串:

When cust_trendd_w_costsv.terms_code like '%[%]%' 
and (prod.dbo.BTYS2012.average_days_pay) - 

(case when isnumeric(substring(cust_trendd_w_costsv.terms_code,3,2))=1 
         then cast(substring(cust_trendd_w_costsv.terms_code,3,2) as float)
         else 0
 end)
<= 5 THEN prod.dbo.cust_trendd_w_costsv.terms_code
于 2013-02-19T08:06:15.473 回答
4

您遇到的问题是您专门搜索包含%字符的字符串,然后将它们(隐式或显式)转换为浮点数。

但是包含符号的字符串%在它们仍然有 a 时不能转换为浮点数%。这也会产生错误:

select CONVERT(float,'12.5%')

如果要转换为浮点数,则需要先删除该%符号,例如:

CONVERT(float,REPLACE(terms_code,'%',''))

只会消除它。我不确定您的terms_code专栏中是否还有其他字符也可能会出错。

您还需要注意,SQL Server 可以非常积极地重新排序操作,因此可能会尝试对 中的其他字符串进行上述转换terms_code,即使是那些不包含%. 如果这是您的错误的根源,那么您需要防止这种激进的重新排序。如果不涉及聚合,CASE表达式通常可以避免最糟糕的问题 - 在尝试转换之前,确保您不想处理的所有字符串都被前面的WHEN子句消除

于 2013-02-19T07:55:03.877 回答
1

如果您确定 Substring Part 返回一个数值,您可以将 substring(....) 转换为 Float :

 .....and (prod.dbo.BTYS2012.average_days_pay) - (CAST(substring(cust_trendd_w_costsv.terms_code,3,2)) as float ) <= 5 ....
于 2013-02-19T07:49:11.510 回答