having大于1的语句,结果输出有1是不是结果有误?不一定
关于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。
评论
热门帖子
- 12025-12-01浏览数:182759
- 22023-05-09浏览数:25044
- 42023-09-25浏览数:18519
- 52020-05-11浏览数:17526