2012-07-25 2 views
2

Я пытаюсь создать очищенную таблицу, которая заменяет поле varchar (50) целым числом. Исходное поле имеет случайные текстовые значения, которые я хотел бы преобразовать в 0 или нулевые значения. Я могу сделать это в инструкции select просто отлично, но получить ошибку при попытке создать мою таблицу.Преобразование текстового столбца в целое число в MySQL

Ниже приведен минимальный пример, который использует строку:

/* This works */ 
DROP TABLE IF EXISTS mytest; 
CREATE TABLE mytest 
AS 
    SELECT convert("123", unsigned) AS mynum; 

/* This works, returning a row of 0 */ 
SELECT convert("TEST", unsigned) AS mynum; 

/* But this fails, with: Truncated incorrect INTEGER value: 'TEST'*/ 
DROP TABLE IF EXISTS mytest; 
CREATE TABLE mytest 
AS 
    SELECT convert("TEST", unsigned) AS mynum;` 

Что случилось с выше, и есть лучший способ добиться того, чего я хочу? Спасибо за помощь.

ответ

2

У меня нет объяснения, почему происходит эта ошибка, но я нашел обходной путь, используя подзапрос:

DROP TABLE IF EXISTS mytest; 
CREATE TABLE mytest 
AS 
    SELECT mynum 
    FROM (SELECT convert("TEST"), unsigned) AS mynum) t; 

Демо: http://www.sqlfiddle.com/#!2/4909a/1

-1

Вместо того, чтобы преобразовать, можно обновить данные и затем изменить таблицу:

UPDATE mytest SET mynum=mynum + 0; 
ALTER TABLE mytest CHANGE COLUMN mynum mynum INT UNSIGNED; 
+0

Это не работает. Изменение столбца возвращает все значения до 0. –

+0

@ cassi.lup: Если значение в 'mytest.mynum' является числом, хранящимся в виде текста (например,« 23 »), то при изменении столбца он будет сохранен как целое число (например, 23). Если значение представляет собой строку (например, «foo»), то изменение типа данных на целое будет изменять значение до 0. Если значение представляет собой строку, которая начинается с числа (например, «23foo»), то изменение типа данных на целое будет сохраните значение как 23. В любом случае, поскольку ОП запросил метод, который поддерживал бы любые существующие целые числа и переводил бы текстовые значения в ноль, мой ответ правильный и не заслуживает нисходящего. – dnagirl

2

Я хотел бы использовать случай заявление для него, а также переключиться на использование CAST вместо новообращенного, так что вы будете получать отказы вместо implici т конверсий.

CREATE TABLE mytest(myVarchar varchar(10)); 
INSERT mytest VALUES ('123'),('TEST'); 

SELECT CASE 
    WHEN myVarchar REGEXP '^[0-9]+$' THEN CAST(myVarchar,unsigned) 
    ELSE 0 
END As mynum 
FROM mytest; 

Я не имею MySQL экземпляр под рукой, чтобы проверить это, так что надеюсь, я не лох синтаксических ошибок.

+0

Вы можете использовать отличный сайт http://sqlfiddle.com для проверки своих запросов. – mellamokb

+0

Это сработало, спасибо. Похоже, что должен быть другой способ, однако, не полагаться на соответствие регулярных выражений. – JIm

0

Похоже, что вы неявно определяете имя столбца оператором select в create. Это может предполагать, что строка «ТЕСТ» является типом данных. Это помогло бы увидеть сообщение об ошибке вы получите, но мое предположение было бы явным образом определить столбец как:

CREATE TABLE mytest(mynum int); 

Тогда

Insert into mytest(mynum) 
select convert("TEST",unsigned) as mynum; 

Это также объясняет, почему ответ с подзапрос может работать, к тому времени, когда он попадает во внешний запрос, он неявно определяется как int.

+0

Спасибо, но я пробовал это, но он тоже не работает. 'Ошибка: 7/25/2012 1:23:05 PM 0: 00: 00.000: Ошибка поиска - Ошибка базы данных MySQL: Усеченное неправильное значение INTEGER: 'TEST' cc1-load.sql: 171: Вставить в mytest (mynum)' – JIm

Смежные вопросы