TSQL:当某些条目是文本时,如何将varchar转换为数字

时间:2014-07-21 15:27:23

标签: sql sql-server tsql

假设我有一个包含两个相关列的表:主键和数量。 '金额'代表金钱,是两件事之一:数字值(例如47.50)或单词' unliquidated'。

我想在此数据集上使用聚合函数。当标准没有返回任何未清算的记录时,以下工作正常。量:

select count(primary_key), sum(cast(amount as numeric)
from (table)
where (criteria)

但是,如果(条件)返回任何未清算的记录,则会引发以下错误:

  

" Msg 8114,Level 16,State 5,Line 1转换数据类型时出错   varchar为数字。

我希望我的查询能够(a)计算未清算的'记录在'计数'功能,以及(b)处理未清算的'作为一个零'出于求和函数的目的。因此,仅仅改变排除未清算的标准并不起作用。

3 个答案:

答案 0 :(得分:4)

虽然y表示列中唯一的非数字字符串是“未清算”,但我不一定相信。无论如何,这应该是安全的:

select count(primary_key),
       sum(case when isnumeric(amount) = 1 then cast(amount as numeric) end)
from table
where (criteria);
当字符串是货币金额或用科学记数法书写时,

ISNUMERIC返回1。在这些情况下,演员会失败,但听起来不会发生这种情况。

请注意,您必须将条件放在case语句中,否则您可能仍会收到错误。

在SQL Server 2012+中,您还可以使用try_convert()

而且,我倾向于使用money代替numeric作为目标数据类型。

答案 1 :(得分:2)

使用NullIF

select count(primary_key), sum(cast(nullif(amount,'unliquidated') as numeric))
from (table)
where (criteria)

答案 2 :(得分:1)

试试这个:

SELECT COUNT(primary_key), SUM(CASE ISNUMERIC(amount) WHEN 1 THEN cast(amount as numeric) END) AS Amount
FROM   (table)
WHERE  (criteria)