如何根据 MySQL 中的条件更新列中的数字?

How to update numbers in a column given a condition in MySQL?

我正在用一列手机更新 table 中的 table,我发现其中的手机负载很差。这些数字的数量少于应有的数量。这些我需要用“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

好像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

如果您的问题具体是 "have less number of numbers than they should",那么这是最直白的表达方式: WHERE CHAR_LENGTH(celular) < expected length

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

CHAR_LENGTH, CAST

编辑:您的 "incorrect double value" 错误表明您在列中至少也有“-”,您可以使用 REPLACE 删除表达式的那些。