将Text或Varchar转换为Decimal类型

时间:2013-02-27 13:58:51

标签: sql tsql decimal varchar

[Return rate]列中,我的值如下:

20.0%
17.1% 
etc

在我的查询中,我想在计算中使用此值。

首先,我将'%'替换为空字符串''

REPLACE([Return Rate], '%' ,'') AS [Test]

这样可行,当[返回率]为'20 .0%'时,我得到的值为'20 .0'。

然后我尝试在计算中使用此[Test]值,例如:

(REPLACE([Return Rate], '%' ,'') * 10) AS [Test]

但我逻辑上得到一个错误,所以我尝试转换这个文本值来执行我的计算:

CAST ( REPLACE([Current Xelus FE Return Rate], '%' ,'') AS decimal(2,1))  [Decimal Test]

在这里我得到了错误:

Arithmetic overflow error converting varchar to data type numeric.
Warning: Null value is eliminated by an aggregate or other SET operation.

有人得到这个错误的答案吗? 非常感谢,

2 个答案:

答案 0 :(得分:0)

如果您的任何行包含空值,您将收到此错误。试试IsNull,像这样:

CAST( 
 IsNull( 
  REPLACE([Current Xelus FE Return Rate], '%' ,'') 
 , '0.0')
AS decimal(5,1))  [Decimal Test]

如果您的数据包含非数字值(如您所提到的,像'N / A'这样的值),您可以使用IsNumeric()函数来消除它们:

CAST( 
  CASE WHEN IsNumeric(
    IsNull( 
      REPLACE([Current Xelus FE Return Rate], '%' ,'') 
    , '0.0')
  ) = 1 THEN IsNull(REPLACE([Current Xelus FE Return Rate], '%' ,''),'0.0')
  ELSE '0.0' 
  END
AS decimal(5,1))  [Decimal Test]

答案 1 :(得分:-1)

尝试将其强制转换为FLOAT - 十进制(2,1)是不够的:

CAST ( REPLACE([Current Xelus FE Return Rate], '%' ,'') AS FLOAT)

然后你应该能够做进一步的计算

CAST ( REPLACE([Current Xelus FE Return Rate], '%' ,'') AS FLOAT) * 10