Sql 为什么在使用case语句时会更改输出?
有人能解释结果吗Sql 为什么在使用case语句时会更改输出?,sql,sql-server,sql-server-2008,tsql,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 BI
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
结果:
第一个select语句的名称:
c1 c2
-34152542256.86 -34152542256
c1 c2
-34152542256.86 -34152542256.00
第二个select语句的名称:
c1 c2
-34152542256.86 -34152542256
c1 c2
-34152542256.86 -34152542256.00
在第一个select语句中,c2的结果只能是BIGINT。
在第二条语句中,结果可以是BIGINT或DECIMAL15,2,属于输入case语句的哪个分支。由于不能在一列中包含混合类型,sql server会自动将c2转换为十进制15,2BIGINT是一个整数值,因此不允许缩放,请尝试使用十进制或数字。 不要放弃阅读
在CASE语句中有一个隐式转换。基本上,c2必须有一个数据类型,但SQL Server不知道它是DECIMAL15,2还是BIGINT,因为这两种类型都是通过CASE语句从各个分支返回的。数据类型优先规则开始生效,c2最终被转换为小数15,2。作为一种尝试,我认为这可能在这种情况下起作用,请尝试以下sql\u变体数据类型:
DECLARE @val sql_variant;
CASE必须返回一个能够存储不同操作数的数据类型:@val是一个小数15,2,结果也是如此。使用CASE语句我们无法正确更改数据类型?CASE无法根据其检查条件返回两个不同的数据类型。它必须返回单个数据类型。因此存在一种隐式转换。看看这个。选择CASE WHEN 1=1,然后选择123.432 ELSE GETDATE END。这将始终返回一个日期时间。当然,您可以在CASE或CastCase中显式使用CAST。那么,我如何有条件地更改数据类型?我想有条件地更改数据类型。可能吗?在同一列中?真是罪过。。。如果需要,可以查看sqlvariant数据类型,但我不建议使用动态数据类型-糟糕的编程风格