SQLZOO中使用CONCAT与ROUND函数出现大量尾随零问题求助
问题描述
我正在SQLZOO上完成练习题,遇到一个问题:在使用CONCAT函数为ROUND处理后的数字添加%符号前,查询结果的小数部分显示正常;但添加CONCAT后,结果的小数部分出现大量无意义的尾随零。
我的SQL代码如下:
SELECT name, CONCAT(ROUND(100*population/(SELECT population FROM world WHERE name = 'Germany'),0),'%') AS percentage FROM world WHERE continent = 'Europe'
- 添加CONCAT后的结果:原本应为整数的百分比,变成了类似
1.0000000000%、23.0000000000%的格式,带有大量尾随零 - 未使用CONCAT函数的结果:百分比显示为正常整数,比如
1、23
解决方案
出现这个问题是因为ROUND返回的是数值类型,和字符串%拼接时,数据库会将数值按默认格式转为字符串,保留了多余的小数位。可以用以下两种方法解决:
方法1:将ROUND结果转为整数类型后再拼接
用CAST把ROUND后的结果转成整数,再和%拼接,即可消除尾随零:
SELECT name, CONCAT(CAST(ROUND(100*population/(SELECT population FROM world WHERE name = 'Germany'),0) AS UNSIGNED),'%') AS percentage FROM world WHERE continent = 'Europe'
方法2:用字符串格式化函数处理(以MySQL为例)
使用FORMAT函数先将数值转为无小数位的字符串,再拼接%:
SELECT name, CONCAT(FORMAT(ROUND(100*population/(SELECT population FROM world WHERE name = 'Germany'),0),0),'%') AS percentage FROM world WHERE continent = 'Europe'
也可以用更简洁的写法,通过数值运算隐式转成整数字符串:
SELECT name, CONCAT(ROUND(100*population/(SELECT population FROM world WHERE name = 'Germany'),0) + 0,'%') AS percentage FROM world WHERE continent = 'Europe'
内容的提问来源于stack exchange,提问作者David Guo
相关产品推荐
相关产品推荐

