将varchar转换为数字时出错

问题描述:

我的case语句存在问题。这里是我的表结构的摘录:将varchar转换为数字时出错

total = decimal(9,2) 
selfrec = decimal(9,2) 

这里是一个的给我的问题CASE语句:

CASE 
    WHEN Invoices.selfrec IS NOT NULL 
    THEN 'Self Reconcilation: ' + Invoices.total + ' - ' + Invoices.selfrec + ' = ' + Invoices.total - Invoices.selfrec ELSE Invoices.total 
END AS 'total' 

当selfrec不为空,似乎试图将字符串,如“自我协调:'数字,显然失败。它为什么这样做?

谢谢。

+1

122个问题,只有2票。真的吗? – 2010-12-13 11:56:14

只要运行该行:

select 'Self Reconcilation: ' + Invoices.total + ' - ' + Invoices.selfrec + ' = ' + Invoices.total - Invoices.selfrec 

你会得到错误。您正试图将数值的隐式转换为varchar。

请尝试以下操作。 VARCHAR(12)应该足够小数(9,2)

select 'Self Reconcilation: ' + cast(Invoices.total as varchar(12)) + ' - ' + cast(Invoices.selfrec as varchar(12)) + ' = ' + cast(Invoices.total - Invoices.selfrec as varchar(12)) 

给你(九+二,和一个用于 ''):

CASE 
    WHEN Invoices.selfrec IS NOT NULL 
     THEN 'Self Reconcilation: ' + cast(Invoices.total as varchar(12)) + ' - ' + cast(Invoices.selfrec as varchar(12)) + ' = ' + cast(Invoices.total - Invoices.selfrec as varchar(12)) 
    ELSE Invoices.total 
END AS 'total' 

另外,为什么不考了首先为NULL。 else子句有效地说'如果不是不为空'。 :-)

+0

+1:刚刚看到这个,你打败了我。 – 2010-12-13 11:54:32

+0

真棒,完美的作品。谢谢! – Chris 2010-12-13 12:00:03

+0

不用担心。如果它有帮助,也许你可以投票。 – 2010-12-13 12:10:43

您要让它根据字符串和数字来推断类型。给它一个提示:

ELSE CONVERT(varchar(30), Invoices.total) 

那么它有VARCHAR和VARCHAR的选择,所以它知道这是从一开始就varchar和不能犯任何错误。

+0

感谢哥们,仍然有问题,虽然 – Chris 2010-12-13 11:52:01

它实际上试图将' = '等转换为数字以便执行数字加法。您首先需要CAST数字到varchar。