? sql语句大全之T-SQL 简易小数处理 亚博足球娱乐场注册,亚博娱乐全天彩,亚博官网赢钱不给
VB.net 2010 视频亚博足球娱乐场注册--任意三数字加yabo.com直达官网 VB.net 2010 视频亚博足球娱乐场注册--任意三数字加yabo.com直达官网 VB.net 2010 视频亚博足球娱乐场注册--任意三数字加yabo.com直达官网
SQL Server 2008 视频亚博足球娱乐场注册--任意三数字加yabo.com直达官网 c#入门经典亚博足球娱乐场注册--任意三数字加yabo.com直达官网 Visual Basic从门到精通视频亚博足球娱乐场注册--任意三数字加yabo.com直达官网
当前位置:
首页 > 数据库 > T-SQL >
  • sql语句大全之T-SQL 简易小数处理

  • 2019-05-02 10:20 来源:未知

今天因应同事提的一则需求,写了一段 CASE WHEN 的整数与小数处理

过程中居然踩了个雷,特此记录下来

首先,需求如下:

当内容为整数或零时则去掉尾端的小数否则就显示原本的小数内容

若内容为 NULL 也维持不变

例如: 120.000 要显示为 120 , 而 120.12345 则维持不变?

在听完需求後,我快速写了以下这段 CASE WHEN 判断

image

但看起来行不通阿!!! 可以看到我在 THEN 的时候直接转成INT类型,但出来的结果还是DECIMAL类型
此时同事说了句,是不是有可能型态在CASE WHEN时就已经决定了

经过测试大致整理出逻辑如下

CASE WHEN 是透过所有 THEN 值的型态优先顺序,来决定最终型态为何

当其中一个型态无法做隐含转换时(比如像下图的文字无法直接转换成小数) ,就会出错

image

?

而透过下列的语法,可以自行测试各种组合的最终型态的优先权为何

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DECLARE?@T?DECIMAL(10,4) = 192.1233
SELECT
SQL_VARIANT_PROPERTY(IntAndDecimal,'BaseType'),
IntAndDecimal
FROM
(
SELECT
CASE
WHEN?@T = FLOOR(@T)
THEN?CAST(@T?as?varchar)
WHEN?@T > FLOOR(@T)
THEN?CAST(@T?as?INT)
WHEN?@T < FLOOR(@T)
THEN?CAST(@T?as?decimal)
END?as?IntAndDecimal
) X  

?从下图可以看到当CASE WHEN 同时有 varchar 、 int 、 decimal 、 float 时

最後会统一转换成float型态?

?

相关的文件可以参考官网
https://docs.microsoft.com/en-us/sql/t-sql/data-types/data-type-precedence-transact-sql?view=sql-server-2017

最後

以下就是我写的完整语法,可以看到透过在 THEN 我分边加了两个 CAST 转换

在优先权的比较後,最後的型态会统一转换成? Float ,所以原本会以 DECIMAL 为主的型态已经消失了


相关的效果也可以参考两个 Column? 的值 ,最右边为预期的结果,左边则为原始结果

image

相关亚博足球娱乐场注册--任意三数字加yabo.com直达官网