sql - 删除case语句中的尾随零
问题描述
我一直在尝试从表的列中删除尾随零。当我尝试从列中删除零时效果很好。但是,当我将它与 case 语句一起使用时(在打开标志时删除零,并在关闭标志时保留它们)它不能正常工作。它不认识国旗。例如,我将列硬编码为常量值;当 1=0(假)时,它正在检索删除零的值。在 else 语句中应该是正确的。
SELECT CASE WHEN 1=0 THEN cast(CAST(123.45000 AS decimal(6,2)) as float)
ELSE
'123.456700'
END
SELECT CASE WHEN 1=0 THEN CONVERT(DOUBLE PRECISION, 123.456700)
ELSE
'123.456700'
END
为什么会这样?谁能帮我这个?
上面的@Tim 很好地解释了下面的内容。
但是,它根本不会删除表中的零。它根本不认识国旗。这是一个例子:
CREATE TABLE #tablea
(item CHAR(2), name VARCHAR(10), amount DECIMAL(9,2))
INSERT INTO #tablea
VALUES ('AB', 'D1', 1.10),
('AB', 'D2', 1.00),
('AB', 'D3', 0.90),
('AB', 'D4', 0.09)
DECLARE @flag INT = 1
SELECT CASE WHEN @flag = 1
THEN CAST(CAST(amount AS DECIMAL(6,2)) AS VARCHAR(max))
ELSE amount END
FROM #tablea
解决方案
正如@JNevill 评论的那样,这里发生的是在表达式的ELSE
分支中发生隐式转换CASE
,将字符串文字转换为浮点数,从而在打印时删除尾随零。一种选择是将IF
部分转换为VARCHAR
:
SELECT
CASE WHEN 1=0
THEN CAST(CAST(123.45000 AS decimal(6,2)) AS varchar(max)) -- a string
ELSE '123.456700' END -- also a string
演示
请注意,在某些 SQL 版本(您的除外)中,您的CASE
表达式甚至不会在没有错误的情况下运行。碰巧这里正在发生无声的转变。
推荐阅读
- javascript - 使用烧瓶、ajax 绘制传单后重新渲染页面
- swift - 状态栏样式更新有一些延迟
- c++ - 使用 INT32_MAX 时无法打印正确答案
- java - 我是第一次在 ES 上工作。我正在尝试将批量 json 文件上传到 java 中的新 Elasticsearch 索引中,但出现错误
- ios - 如何使用 CMMotionManager 知道设备向左/向右/向后或向前倾斜
- sql - 如何在 PL/SQL 中解决此过程
- google-bigquery - 如何从 geoJSON 文件中分离具有 NULL 值的记录?
- database - Cassandra:零默认 TTL 是什么意思?
- sequelize.js - Sequelize 忽略 UPDATE 方法的关联模型上的 WHERE 条件(不构建查询的 INNER JOIN 部分)
- c# - 解析 Json 列表