MySQL中cast/convert转换avg结果为int报错但round、floor可正常运行的原因
问题原因分析
- MySQL的
CAST()和CONVERT()函数对整数类型的转换目标有特殊语法要求,在业内广泛使用的MySQL 5.x版本中,不支持直接写int作为转换目标类型,需要替换为SIGNED(对应有符号整数)或者UNSIGNED(对应无符号整数)。 - 你本地单独执行
cast(25.5 as int)可以成功,是因为本地使用的是MySQL 8.0及以上的高版本,高版本做了语法兼容,支持直接写int;但HackerRank平台使用的是低版本MySQL环境,所以会抛出1064语法错误。
正确实现写法
你可以替换转换目标类型解决报错,示例如下:
SELECT CAST(AVG(population) AS SIGNED) FROM city;
如果使用CONVERT函数,对应写法为:
SELECT CONVERT(AVG(population), SIGNED) FROM city;
如果需求是四舍五入取整,也可以直接用你提到的可正常运行的ROUND()函数实现,逻辑更直观:
SELECT ROUND(AVG(population)) FROM city;
补充说明
有C/C++开发背景很容易默认强转使用int关键字,但SQL属于领域特定语言,不同数据库的方言语法和通用编程语言的语法有差异,使用时需要匹配对应数据库的语法规范。
内容的提问来源于stack exchange,提问作者Vinay Chimmili
相关产品推荐
相关产品推荐

