我的案例陈述存在问题。这是我的表格结构的摘录:
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不为null时,它似乎尝试将诸如'Self Reconcilation:'之类的字符串转换为数字,显然会失败。为什么要这样做?
感谢。
答案 0 :(得分:4)
你要离开它来推断一个基于字符串和数字的类型。给它一个提示:
ELSE CONVERT(varchar(30), Invoices.total)
然后它有varchar和varchar的选择,所以它知道这是从一开始就是varchar,并且不会出错。
答案 1 :(得分:3)
它实际上是在尝试将' = '
等转换为数字以执行数字加法。您需要CAST
数字到varchar。
答案 2 :(得分:3)
只需运行此行:
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子句实际上是在说'if not not null'。 : - )