【问题标题】:How to update numbers in a column given a condition in MySQL?如何在给定条件的 MySQL 中更新列中的数字?
【发布时间】:2019-11-14 12:17:39
【问题描述】:

我正在用一列手机更新 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

【问题讨论】:

  • 更新您的问题并添加您的表 usuarios_registrados 架构
  • 试试引号:UPDATE usuarios_registrados SET celular = '0' WHERE celular BETWEEN '1' AND '19999999';

标签: mysql sql sql-update error-code mysql-error-1292


【解决方案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

【讨论】:

  • @forpas 请显示不起作用的确切代码。
  • 我的意思是如果 celular = '2' 那么它不会被更新为 '0',尽管我认为这是 OP 想要的条件 BETWEEN '1' AND '19999999'
  • '2' 不在 '1' 和 '19999999' 之间;
  • 它不应该工作,或者不可靠;见minor adjustments
  • @FedePosi 应该“02392-15635834”,或者任何以 0 开头的数字,真的会被擦除吗?是否有以 2 或更高开头的有效数字?
【解决方案2】:

如果您的问题具体是“数字数量少于应有的数量”,那么这是最直接的表达方式: WHERE CHAR_LENGTH(celular) &lt; expected length

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

CHAR_LENGTH, CAST

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

【讨论】:

    猜你喜欢
    • 2014-02-28
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 2020-05-23
    相关资源
    最近更新 更多