Как обновить числа в столбце с учетом условия в MySQL? - PullRequest
0 голосов
/ 03 июля 2019

Я обновляю таблицу в 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

Ответы [ 2 ]

1 голос
/ 03 июля 2019

Кажется, 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;

Демо

0 голосов
/ 03 июля 2019

Если ваша проблема конкретно "имеет меньшее количество чисел, чем должно быть" , то это наиболее буквальное выражение этого: WHERE CHAR_LENGTH(celular) < expected length

Однако, "19999999" предлагает«20000000» действителен.Если вы уверены, что нет нечисловых символов, вы можете попробовать: WHERE CAST(celular AS SIGNED) BETWEEN 1 AND 19999999

CHAR_LENGTH , CAST

Редактировать: Ваш "Неправильное двойное значение «ошибки» предполагает, что в столбце есть хотя бы «-», вы можете использовать REPLACE, чтобы удалить их для выражения.

...