如何根据 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;
如果您的问题具体是 "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
编辑:您的 "incorrect double value" 错误表明您在列中至少也有“-”,您可以使用 REPLACE
删除表达式的那些。
我正在用一列手机更新 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;
如果您的问题具体是 "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
编辑:您的 "incorrect double value" 错误表明您在列中至少也有“-”,您可以使用 REPLACE
删除表达式的那些。