GBase 8a
其他
文章

having大于1的语句,结果输出有1是不是结果有误?不一定

发表于2025-04-30 10:32:0135次浏览3个评论

关于GBase 8a的隐形转换机制,主要是指数据库在执行SQL查询时,自动进行的数据类型转换过程。这种机制有助于简化用户操作,但同时也需要谨慎使用以避免潜在的问题。当操作涉及不同类型的数据时,GBase 8a可能会自动将一种数据类型转换为另一种数据类型以便操作能够顺利进行。例如,在比较或计算中,字符串可能被隐式地转换为数字,或者不同精度的数值类型之间互相转换。
举个例子:
select key_id_main,city_code,key_id_sub,sum(adjus_ratio) as adjus_ratio
from public.tmp_04_tc_usr_product_fee_detail_mon_202503
group by key_id_main,city_code,key_id_sub
having sum(adjus_ratio) >1;
结果输出如下:

初看结果,好像有问题,明明having已经过滤掉大语句1了,为什么还出现1。但仔细查看表结构。其中adjus_ratio为varchar(255)。

这种比较过程中,出现了系统的隐形转换机制,系统根据右边的类型,把varchar自动转换成double类型,当数据带有小数的时候,出现了小数点的数据不准。        比如:48.8 -->> 可能变成 48.799999999999998这样的double数字,导致avg以后不是50而是,49.999999999999998这样的。所以,无论是 select avg(varchar) = 50 还是 having avg(varchar)>='50' 都是假。 having avg(varchar)>='49' 或者 having avg(varchar)>=49都应该有数据。
例子中的1.999999这些数据显示为1,实际上并不是1,所以输出的结果不是问题。如何避免此类情况出现,建议有小数参与的数学运算使用decimal。

评论

登录后才可以发表评论
用户头像
levvel发表于 7个月前
评论是对发帖人的一种尊重
用户头像
levvel发表于 5个月前
讲得很清楚!
GBase用户51840发表于 2个月前
学习了