0

我正在用一列手机更新 MySQL 中的一个表,在那里我发现手机加载严重。这些数字的数量少于应有的数量。这些我需要用“0”替换。

我在 MySQL 8.0.3 版中尝试过这些是我对代码的尝试:

- 第一次尝试

UPDATE usuarios_registrados
    SET celular = '0'
    WHERE celular <= 1
    OR celular >= 19999999;

--第二次尝试

UPDATE usuarios_registrados
    SET celular = 0
    WHERE celular
    BETWEEN 1
    AND 19999999;

这些是错误:

- 第一次尝试

Error Code: 1292. Truncated incorrect DOUBLE value: '02392-15635834'    0.204 sec

--第二次尝试

Error Code: 1292. Truncated incorrect DOUBLE value: '02392-15635834'    0.125 sec
4

2 回答 2

1

它似乎celular是一个字符串类型的列,您正在尝试使用数值进行更新,因此会出现问题。针对这个问题,在过程中创建游标并调用它可能是一种稳健的方式:

CREATE PROCEDURE Upd_Celular()
BEGIN
  DECLARE v_celular   varchar(50);
  DECLARE v_celular2  int;
  DECLARE v_celular3  int;
  DECLARE v_id        int;
  DECLARE finished BOOL DEFAULT FALSE;

  DECLARE cur CURSOR FOR 
  SELECT id, celular, 
         case when strcmp( cast(celular as signed) , celular ) = 0 then 1 else 0 end 
         as celular2, cast(celular as signed) as celular3
    FROM usuarios_registrados;

  DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = TRUE;

  OPEN cur;

  REPEAT FETCH cur INTO v_id,v_celular,v_celular2,v_celular3;
  IF  NOT finished 
    AND v_celular2 != 0  
    AND v_celular3 BETWEEN 1 AND 19999999
  THEN
    UPDATE usuarios_registrados s
       SET s.celular = '0'
     WHERE s.id = v_id;   
  END IF;

  UNTIL finished END REPEAT;

  CLOSE cur;
END;

Demo

于 2019-07-03T19:16:46.963 回答
0

如果您的问题特别是“数字数量少于应有的数量”,那么这是最字面的表达方式: WHERE CHAR_LENGTH(celular) < expected length

但是,“19999999”表明“20000000”是有效的。如果您确定没有非数字字符,您可以尝试:WHERE CAST(celular AS SIGNED) BETWEEN 1 AND 19999999

CHAR_LENGTH , CAST

编辑:您的“不正确的双值”错误表明您在列中也至少有“-”,您可以使用它REPLACE来删除表达式中的那些。

于 2019-07-03T19:31:43.823 回答