执行这些并检查结果为什么会这样?
declare @a decimal(8,3) =235.363
declare @b int =1
select case @b
when 1 then cast(@a as int)
when 2 then CAST(@a as decimal(8,3))
end
Result : 235.000
declare @a decimal(8,3) =235.363
declare @b int =1
select case @b
when 1 then cast(@a as int)
--when 2 then CAST(@a as decimal(8,3))
end
Result : 235
declare @a decimal(8,3) =235.363
declare @b int =1
select case @b
when 1 then cast(@a as tinyint)
when 2 then CAST(@a as float)
end
Result : 235
答案 0 :(得分:2)
你看到的不是你得到的。
对于列类型,SQL Server选择正确的,更宽的类型(float
超过tinyint
,decimal
超过int
。您可以通过执行select into
而不是仅选择来验证。
只是显示规则不同
当所选列类型为float
时,如果没有小数部分,则看不到尾随.000
。
对于设置了明确位置的decimal
,例如decimal(8,3)
,即使没有小数部分,您也会看到尾随.000
。如果您删除说明符并仅将decimal
作为列类型,则.000
将消失。
所有这些都不会影响实际的列类型,它总是最宽的类型。
答案 1 :(得分:2)
返回类型
从中输入类型集中的最高优先级类型
result_expressions
和可选的else_result_expression
。更多 信息,请参阅Data Type Precedence (Transact-SQL)。
如果您点击指向数据类型优先级的链接,您会看到float
的优先级高于decimal
,而tinyint
的优先级高于{{1}},因此会出现此行为。
答案 2 :(得分:0)
可能施法操作会将所有选项投射到更大的类型。
来自MSDN:
input_expression和每个when_expression的数据类型必须是 相同或必须是隐式转换。
答案 3 :(得分:0)
施放到整数无效。
在CASE
语句中,您只能返回一种类型的数据,因此根据您的语句,您可以返回INT
或decimal(8,3)
,因为您的案例陈述有{{1}所以这里decimal(8,3)
数据被隐式转换为十进制! 请参见下面的示例:,请始终尝试在INT
语句中使用相同的返回类型,以获得正确的预期结果,谢谢。
1
CASE
2
select case @b
when 1 then CAST(@a as int) -- return type INT
when 2 then CAST(@a as int) -- return type INT
end