2012-07-20 59 views
1

我运行下面的SQL但0的情况下,似乎总是打:滑稽的行为,某些情况下总是被击中

select 
ccy.numberofdecimals, 
ABS(round(ts.TRADECCY1AMOUNT, 2)), 

CASE 
WHEN CCY.NUMBEROFDECIMALS = 0 THEN 
CONVERT(Numeric(38,0), ABS(round(TS.TRADECCY1AMOUNT, 0))) 
WHEN CCY.NUMBEROFDECIMALS = 2 THEN 
CONVERT(Numeric(38,2), ABS(round(TS.TRADECCY1AMOUNT, 2))) 
WHEN CCY.NUMBEROFDECIMALS = 3 THEN 
CONVERT(Numeric(38,3), ABS(round(TS.TRADECCY1AMOUNT, 3))) 
END as 'Transaction Amount', 


FROM 
blah blah blah 

然而,我的结果集永远是:

enter image description here

当我除去0小数箱子,它产生正确的结果。任何人有任何想法为什么这个案例总是评估0的情况?

谢谢!

+3

你不能有一个具有不同数据类型的列,既可以是'Numeric(38,0)','Numeric(38,2)'或'Numeric(38,3)',所以它将第一个数据类型赋值给你列上的所有行 – Lamak 2012-07-20 19:30:05

+3

@Lamak - 你可以将一个分支转换为'sql_variant'数据列表,然后它会给出想要的结果。尽管这看起来像表现层应该处理的东西。 – 2012-07-20 19:33:51

+1

@MartinSmith - 你说得对,尽管在我脑海里'sql_variant'仍然是一个数据类型。 – Lamak 2012-07-20 19:37:37

回答

0

我觉得缺少你的else语句,并且有不同的数据类型会使它全部混淆。这是一个很好的调试技巧,你应该学习。简化你的代码到完全基本的地步。然后开始添加你的逻辑。你会发现你犯错的地方非常快。在你的情况下,从这开始:

SELECT CASE 
    WHEN t.a = 0 THEN 1 
    WHEN t.a = 2 THEN 2 
    WHEN t.a = 3 THEN 3 
END as c 
FROM ( select 1 as a 
     union 
     select 2 as a 
     union 
     select 3 as a 
    ) t 

并改变你的THEN子句一个接一个。 CASE声明显然是有效的,所以它一定是你正在做的事情。