2016-09-06 149 views
0

我有一张表格,其中包含Varchar类型的数据,但我有数字和一些字符串,它们分别是BuildingIBS。但是我试图摆脱字符串。我只知道如何摆脱一个。当我尝试添加另一个,它抱怨论据,我怎么能做到这一点。失败将Varchar转换为浮点数

ROUND(ISNULL(CASE 
        WHEN [lentgth] IN('Building', '', 'IBS', '') THEN 0 
        ELSE CONVERT(FLOAT, REPLACE([lentgth], 'm', 'i')) 
       END, 0), 0) 
+0

你根本无法将文本转换为浮动时,它包含非数字字符。 –

+0

当这个值应该是float的时候,它是否有一个点或逗号作为十进制分隔符?我相信它必须是一个点,所以你检查了吗? – GuidoG

+0

您能给我们一些样品数据吗? – GuidoG

回答

2

可以使用isnumeric功能:

ROUND(cast(case 
      when isnumeric(lentgth) = 0 then 0 
      else lentgth 
      end as float) 
    , 0) 
+0

谢谢,这个工作 – codelover

+0

这将适用于几乎任何值,但要注意确实存在一些单个字符值会导致失败,包括。 (点)和(逗号)。请参阅https://blogs.msdn.microsoft.com/manub22/2013/12/23/use-new-try_parse-instead-of-isnumeric-sql-server-2012/ – larsts

1

在SQL Server 2012+,你可以使用TRY_CONVERT()

TRY_CONVERT(FLOAT, REPLACE([lentgth], 'm', 'i')) 

这将返回NULL如果转换无法完成。如果你想0,使用COALESCE()IFNULL()

ISNULL(TRY_CONVERT(FLOAT, REPLACE([lentgth], 'm', 'i')), 0) 

COALECE()评估的第一个参数的两倍(这我认为是一个MS SQL性能的bug)。因此,当第一个参数是all或subquery函数时,ISNULL()是可取的。

相关问题