MySQL Case 不工作 ROUND 值

标签 mysql case

我正在尝试 ROUND() 或不是所选值。查询看起来像这样:

SELECT  b.Series,
        CASE 
            WHEN Series = 'DMS' THEN ROUND(b.Quantity,0)
            ELSE ROUND(b.Quantity,2)
        END AS Quantity
        FROM bill b

我也试过

CASE Series
     WHEN 'DMS' THEN ROUND(b.Quantity,0)
     ELSE ROUND(b.Quantity,2)
END AS Quantity,

IF(b.Series = 'DMS', ROUND(b.Quantity,0), ROUND(b.Quantity,2)) AS Quantity,

每次我得到末尾的两位小数。

Series 是 'DMS' 时 Quantity 应该是一个整数(没有小数),在其他情况下 Quantity 应该是两个小数点。

最佳答案

在结果集中,数据类型是整个结果集的的一个属性。

对于结果集中的任何给定列,该列中每一行的值必须具有相同的数据类型。

此查询的返回列的数据类型将有必要由服务器设置为类似于 DECIMAL(11,2) 的内容,以容纳所有可能的值.

我预计您所看到的实际上是正确的四舍五入,但末尾有一个“意外的”.00

CAST(CASE ... END AS CHAR) AS Quantity 将 -- 可能 -- 通过转换为您提供看起来更像您期望的结果一切都变成一个字符串。

这显然是一些非常草率的类型处理,但这并不比期望不同类型出现在同一列中更不合理……这是不可能的。

更正确的解决方案是将它们作为两个不同的列返回,使用两个 CASE 表达式或 IF()

ROUND(IF(Series = 'DMS',b.Quantity,NULL),0) AS dms_quantity,
ROUND(IF(Series = 'DMS',NULL,b.Quantity),2) AS non_dms_quantity

请注意,两个 IF() 测试都计算相同的表达式并反转它们的参数,而不是第二个使用 != 且参数相同,因此系列的 NULL 值(如果可能)由第二次测试正确处理。 (任何 != NULL 都不能计算为真;IF() 的第三个参数用于 FALSE 和 NULL 结果)。

关于MySQL Case 不工作 ROUND 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36333741/

相关文章:

mysql - 在这种情况下如何进行高效的 SQL Select?

php - 在 php 准备好的语句中传递数组值不起作用

view - 使用 CASE 和 SQLITE 匹配字段

MySQL - 条件查询,语句结果

testing - 测试用例管理工具2017

mysql - 来自 GCE 实例的 CloudSQL ERROR 2013

mysql - 从 cPanel 配置远程 MySQL 连接

sql - 在 PostgreSQL 中使用 CASE 一次影响多个列

sql - 在 SQL 中使用 CASE 语句时不等于

php - LOAD DATA INFILE 目录结构