我正在尝试 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/