我的表格有mrr varchar(64)
列。我无法更改列的类型。
这个简单的查询:
select mrr, cast(mrr as decimal(10,2)) ass f_mrr
FROM projects
where mrr is not null and creator_fname='Lisa'
返回意外结果。以下是部分列表:
mrr cast(mrr as decimal(10,2))
663.90 663.90
40.00 40.00
675.00 675.00
0.00 0.00
100.00 100.00
2,950.00 2.00
3,779.90 3.00
-8,482.00 -8.00
最后3行有什么用?我假设这是CAST
这样做的。
有人可以解释发生了什么吗? 为什么它只对某些行而不是其他行执行此操作?
如何可靠地将varchar(64)
投射到decimal
?
答案 0 :(得分:4)
正在发生的是逗号是不是有效号码的一部分。 MySQL停止解析第一个非“数字”字符的数字。
当MySQL将字符串转换为数字时,它仅转换前导“数字”字符,其中包括可选的前导符号,数字,可选的小数点和更多数字。
其他所有内容都被截断/忽略。顺便说一句,这包括整个字符串,如果它不开始带有“数字”。
您可以尝试以下查询:
select mrr, cast(trim(replace(mrr, ',', '')) as decimal(10,2)) as f_mrr
from projects
where mrr is not null and creator_fname = 'Lisa'
答案 1 :(得分:0)
试试这个:
set @a = "295.00";
select if(right(@a,2)=00,CONCAT_WS('.',convert(@a,decimal(10,2))),@a)