使用MySQL 5.5,我试图用一个由两个其他数字组合创建的值来更新一个十进制字段,一个是小数点右边的数字,另一个是整数部分的号:
例如: x = 5,y = 19,Z = 5.19
但是,小数部分实际上是递增的变量。我已经设置了SET语句来增加变量,但update语句只能看到它的初始值。
有什么想法吗? 编辑:这是我使用代码的程序(根据答案更正):
BEGIN
DECLARE certNo DECIMAL(13,3);
DECLARE dups, ID INT DEFAULT 0;
DECLARE done INT default false;
DECLARE cur1 CURSOR FOR
SELECT cert_id,certNum, COUNT(certNum) as Duplicates from migrate
GROUP BY certNum
HAVING Duplicates > 1;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur1;
read_loop: LOOP
FETCH cur1 into ID, certNo, dups;
IF done THEN LEAVE read_loop;
END IF;
set @counter=0;
while @counter <= dups DO
UPDATE migrate_cert_tblcert
#SET certNum = CONCAT_WS('.',certNo,@duplis)
SET certNum = cast(certNo + @counter/100 as decimal(10,2))
WHERE certNum = certNo;
SET @counter := @counter + 1;
SELECT certNo,@counter,cast(truncate(certNo,0) + @counter/100 AS DECIMAL(10,2)) new;
END WHILE;
END LOOP;
CLOSE cur1;
END
我注意到现在代码部分工作,但@counter递增的值不会再次返回更新语句! (更新语句只能看到&#34; 1&#34;)
答案 0 :(得分:2)
您需要事先知道您需要的小数位数。否则,您如何知道y=1
是0.1
还是0.01
还是0.001
还是......?
一旦你决定了,事情变得非常简单:
set @decPos = 100; -- Asuming y "counts" hundreths
select x, y, cast(x + y / @decPos as decimal(8,2))
from yourTable;
答案 1 :(得分:2)
Concat然后转换为数据类型
SELECT CAST(concat(concat(1, '.'), 2 ) AS DECIMAL(10,4) )
或更简单
SELECT 1 + 2/100
with cast
SELECT cast(1 + 2/100 as decimal(10,2))
答案 2 :(得分:1)
UPDATE t1 SET col1 = CONCAT(5,'.',19);
鉴于MySQL在隐式投射方面的倾向,我认为这有点违反直觉 - 可能是最干净的解决方案,因为对你的输入进行划分可能会导致不精确。这会生成一个&#34;看起来像&#34;它应该(为此)隐式地转换为目标列的正确数据类型。