Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:在游标中的Update语句中使用递增变量_Mysql_Sql_Casting_Sql Update_Scope - Fatal编程技术网

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

MySQL:在游标中的Update语句中使用递增变量,mysql,sql,casting,sql-update,scope,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

使用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 incremented值不再返回update语句!update语句只将is视为1

您需要事先知道所需的小数位数。否则,您如何知道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;

Concat然后强制转换为数据类型

SELECT CAST(concat(concat(1, '.'), 2 ) AS DECIMAL(10,4) ) 
或者更简单

SELECT 1 + 2/100
带石膏

SELECT cast(1 + 2/100 as decimal(10,2))

考虑到MySQL在隐式转换方面的倾向,我认为这可能是最干净的解决方案,因为对输入进行除法可能会导致不精确。这将生成一个看起来像十进制的结果字符串,因此应该隐式转换为目标列的正确数据类型。

但我认为concat需要多个参数,而不仅仅是两个。这可能是它不起作用的原因吗?无论如何,我成功地将数字转换为字符串,但当我尝试将此字符串转换为十进制类型变量时,它永远不会起作用。你是对的,我知道它将是数百。然而,我甚至尝试过这样的方法:将Z=castx+1/1000设为小数13,3,但它仍然以预期的格式保存和显示Z!我发现问题出在update语句中增加一个变量!现在:我放弃了while循环,我放弃了SET@counter,并用@counter:=@counter+1/100替换了@counter/100…它成功了!我明天会试试这个,有时候它比你想象的要简单!
UPDATE t1 SET col1 = CONCAT(5,'.',19);