当前位置: 首页 > news >正文

T-SQL 簡易小數處理

今天因應同事提的一則需求,寫了一段 CASE WHEN 的整數與小數處理

過程中居然踩了個雷,特此記錄下來

首先,需求如下:

當內容為整數或零時則去掉尾端的小數否則就顯示原本的小數內容

若內容為 NULL 也維持不變

例如: 120.000 要顯示為 120 , 而 120.12345 則維持不變 

在聽完需求後,我快速寫了以下這段 CASE WHEN 判斷

image

但看起來行不通阿!!! 可以看到我在 THEN 的時候直接轉成INT類型,但出來的結果還是DECIMAL類型
此時同事說了句,是不是有可能型態在CASE WHEN時就已經決定了

經過測試大致整理出邏輯如下

CASE WHEN 是透過所有 THEN 值的型態優先順序,來決定最終型態為何

當其中一個型態無法做隱含轉換時(比如像下圖的文字無法直接轉換成小數) ,就會出錯

image

 

而透過下列的語法,可以自行測試各種組合的最終型態的優先權為何

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

转载于:https://www.cnblogs.com/KingJaja/p/9170679.html

相关文章:

  • 基于 CentOS 搭建 WordPress 个人博客
  • eclipse部署jrebel热启动后报错java.lang.OutOfMemoryError: PermGen space问题
  • Powershell渗透测试系列–进阶篇
  • 【leetcode】802. Find Eventual Safe States
  • 架构的代码结构
  • 做RAID1 遇到种种问题
  • jira安装
  • 对指定多个目录的第一级保留进行保留(再递归删除空目录)
  • C++之const类成员变量,const成员函数
  • 小程序开发之路(一)
  • js学习笔记之自调用函数和原型链
  • vivx面试题
  • centos7.2编译安装mysql5.7.21报错解决
  • 进程与线程区别
  • ASP.NET CORE系列【四】基于Claim登录授权
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • CEF与代理
  • ESLint简单操作
  • gcc介绍及安装
  • Golang-长连接-状态推送
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • Java Agent 学习笔记
  • JAVA 学习IO流
  • js中的正则表达式入门
  • linux学习笔记
  • Node项目之评分系统(二)- 数据库设计
  • Redis的resp协议
  • Redux 中间件分析
  • swift基础之_对象 实例方法 对象方法。
  • Tornado学习笔记(1)
  • Vue 动态创建 component
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 推荐一个React的管理后台框架
  • 正则与JS中的正则
  • 《码出高效》学习笔记与书中错误记录
  • Java总结 - String - 这篇请使劲喷我
  • 容器镜像
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (16)Reactor的测试——响应式Spring的道法术器
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (C语言)二分查找 超详细
  • (Java数据结构)ArrayList
  • (poj1.3.2)1791(构造法模拟)
  • (solr系列:一)使用tomcat部署solr服务
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • .Net - 类的介绍
  • .NET CF命令行调试器MDbg入门(一)
  • .Net Winform开发笔记(一)
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .net和php怎么连接,php和apache之间如何连接