使用case语句时为什么输出会改变?

时间:2015-05-20 09:13:15

标签: sql sql-server sql-server-2008 tsql

有人可以解释结果吗?

DECLARE @dec AS VARCHAR(5)

SET @dec = 'Yes'

DECLARE @val DECIMAL(15, 2);

SET @val = - 34152542256.86;

SELECT @val as c1
    ,CAST(@val AS BIGINT) as c2

SELECT @val as c1
    ,CASE @dec
        WHEN 'Yes'
            THEN CAST(@val AS BIGINT)
        ELSE @val
        END as c2

结果:

第一个选择语句的

 c1                     c2
-34152542256.86         -34152542256
第二个选择语句

 c1                     c2
-34152542256.86         -34152542256.00

4 个答案:

答案 0 :(得分:2)

您的CASE声明中有隐式转换。基本上,c2必须具有数据类型,但SQL Server不知道它是DECIMAL(15,2)还是BIGINT,因为这两种类型都是从各个分支返回的通过CASE声明。数据类型优先级的规则启动,c2最终转换为DECIMAL(15,2)

答案 1 :(得分:0)

在第一个select语句中,c2的结果只能是BIGINT。 在第二个语句中,结果可以是BIGINT或DECIMAL(15,2),属于case语句的哪个分支。 由于您不能在一列中使用混合类型,sql server会自动将c2转换为DECIMAL(15,2)

答案 2 :(得分:0)

BIGINT是一个整数值(它不允许缩放),尝试使用DECIMAL或NUMERIC。 并且不要放弃阅读documentation

答案 3 :(得分:0)

试一试,我认为这可能适用于这种情况,请尝试sql_variant这样的数据类型:

DECLARE @val sql_variant;