MariaDB和奇怪的显示

kd3sttzy  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(134)

我指定我不使用MariaDB的最新版本,但我无法在服务器上进行更新。
我使用的是10.0.36版。
我重新创建了一个简单的表,下面是它的结构和内容,以解释我的问题。

我的问题是呈现SQL查询。如果运行此查询:

select VIS.idVisite as 'key',if(VIS.weightVisite is not NULL,VIS.weightVisite,'') as 'weight' 
from visite as VIS 
inner join client as CLI on VIS.idClientVisite=CLI.idClient 
where VIS.idVisite in (1,2,3,4) 
order by VIS.idVisite

我得到这个:

不显示大于或等于100的小数位数。
如果我这样修改查询:

select VIS.idVisite as 'key',VIS.weightVisite as 'weight' 
from visite as VIS 
inner join client as CLI on VIS.idClientVisite=CLI.idClient 
where VIS.idVisite in (1,2,3,4) 
order by VIS.idVisite;

我得到这个:

正确显示小数
如果我这样修改查询:

select VIS.idVisite as 'key',if(VIS.weightVisite is not NULL,VIS.weightVisite,'') as 'weight' 
from visite as VIS 
where VIS.idVisite in (1,2,3,4)

我得到这个:

正确显示小数
所以...?
我迷路了。为什么当我把“IF”条件和“INNER JOIN”结合起来时,我没有正确的小数点...?
而“如果”本身就很好用。
而“INNER JOIN”单独使用效果很好。
如果有人有主意。
客户端表的结构如下:

指令集

vxf3dgd4

vxf3dgd41#

查询的问题在于,您使用以下语句让数据库执行从float到string的隐式类型转换:

if(VIS.weightVisite is not NULL,VIS.weightVisite,'')

这不是一个好的做法(来自MariaDB docs):
当MariaDB使用操作数或不同类型时,会发生隐式类型转换,以使操作数兼容。
最好不要依赖隐式转换;而是使用CAST显式转换类型。
由于某些未知的原因,DB有时将其转换为char(4),有时(可能)转换为char(5)。
您可以明确地转换它,例如:

if(VIS.weightVisite is not NULL,cast(VIS.weightVisite as char(5)),'')

cast(if(VIS.weightVisite is not NULL,VIS.weightVisite,'') as char(5))

而且它总是显示正确的结果。但是如果转换为char不是你的意图,你可以使用正确的类型来避免它:

if(VIS.weightVisite is not NULL,VIS.weightVisite,0)

相关问题