MySQL:在游标中的Update语句中使用递增的变量

时间:2014-07-08 22:40:54

标签: mysql sql casting sql-update scope

使用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;)

3 个答案:

答案 0 :(得分:2)

您需要事先知道您需要的小数位数。否则,您如何知道y=10.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;它应该(为此)隐式地转换为目标列的正确数据类型。