MySQL - вставить значение VARCHAR из T1 в поле DECIMAL в T2 - PullRequest
1 голос
/ 13 июня 2011

В Таблице_1 я импортировал данные из электронной таблицы.В одном столбце таблицы есть смешанные значения: 94,7, 45,0, 36, автомобиль, автобус .... и т. Д.Тип данных VARCHAR (10)

Я хочу вставить значения из этого столбца из Table_1 в поле DECIMAL (5,1) в Table_2.Я хочу, чтобы нечисловые значения регистрировались как 0.0.Это важно.

Я пробовал несколько вещей, включая CAST (), который работает в моем MySQL GUI, но выдает длинный ряд предупреждений.Вот пример типа SQL, который я пробовал.

DELETE FROM table_2;
INSERT INTO table_2 (NAME, decimal_column)
   (SELECT NAME
         , CAST(varchar_column AS DECIMAL(5,1))
      FROM table_1) ;

Пример предупреждений MySQL.

Код предупреждения: 1366 Неверное десятичное значение: '' для столбца ''в строке -1

Код предупреждения: 1292 Сокращенное неверное значение DECIMAL: 'house'

Кроме того, PHP не будет иметь ничего из этого.Когда я пытаюсь выполнить тот же запрос с использованием PHP, я получаю это фатальное сообщение об ошибке:

Неверное десятичное значение: '' для столбца '' в строке -1

Спасибо за любые предложения

Ответы [ 2 ]

3 голосов
/ 13 июня 2011

Если вы очищаете table_2, вы можете использовать TRUNCATE table_2;, который может быть быстрее.

Один из способов сделать это (хотя я не знаю, является ли он лучшим; это может быть немногомедленно для больших наборов данных) использовать регулярное выражение:

INSERT INTO table_2 (NAME, decimal_column)
(SELECT NAME
     , IF(varchar_column REGEXP '^[[:digit:].]+$', varchar_column, 0.0)
  FROM table_1) ;

Это предполагает, что в десятичных значениях varchar_column нет пробелов.Если возможно, вы можете использовать TRIM следующим образом:

IF(TRIM(varchar_column) REGEXP '^[[:digit:].]+$', TRIM(varchar_column), 0.0)
1 голос
/ 13 июня 2011

Я попробовал следующее, и это отлично сработало для меня:

INSERT INTO `table_2` (`decimal_column`) SELECT CAST(`varchar_column` AS DECIMAL(5,1)) FROM `table_1`;

В таблице, которую я использовал, было пустое значение, десятичное значение (как VARCHAR) и слово "дом", и все было преобразовано, как и ожидалось.

Предупреждения можно игнорировать. По сути, MySQL говорит вам, что он пытался преобразовать данные, которые он не мог преобразовать. Например, слово «дом» не может быть преобразовано в десятичное значение, поэтому MySQL предупреждает вас (как и PHP). Причина, по которой вы не видите ошибку в графическом интерфейсе MySQL, заключается в том, что ошибка подавлена, поскольку запрос сработал.

Если вы хотите скрыть ошибки, вы всегда можете добавить символ @ перед вызовом PHP (т.е. @ mysqli-> query ('...'), используйте ini_set ('display_errors', false), чтобы отключить все ошибки или сообщение об ошибке (E_NONE).

...