2012-07-25 39 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. – 2013-01-07 03:22:20

+0

@ cassi.lup:如果'mytest.mynum'中的值是存儲爲文本的數字(例如「23」),那麼當列被更改時,它將被存儲爲整數(例如23)。如果該值是一個字符串(例如「foo」),那麼將數據類型更改爲整數將將該值更改爲0.如果該值是以數字開頭的字符串(例如「23foo」),則將數據類型更改爲整數將值存儲爲23.無論如何,由於OP要求一種方法來維護任何現有的整數並將文本值轉換爲零,我的回答是正確的,不應該得到一個低估。 – dnagirl 2013-01-07 12:29:25

2

我會使用一個case語句它也切換到使用,而不是轉換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 2012-07-25 17:37:58

+0

這工作,謝謝。似乎應該有另一種方式,但是,不依賴於正則表達式匹配。 – JIm 2012-07-25 18:08:19

0

看起來好像你是通過創建中的select語句隱式定義列名。這可能假設「TEST」字符串是數據類型。這將有助於看看你會得到錯誤信息,但我的假設是顯式定義列:

CREATE TABLE mytest(mynum int); 

然後

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

這也就是爲什麼子查詢的答案可能工作,當它到達外部查詢時,它被隱式定義爲一個int。

+0

謝謝,但我曾嘗試過,但也失敗了。 '錯誤:2012年7月25日1:23:05 0:00:00.000:查找錯誤 - MySQL數據庫錯誤:截斷不正確INTEGER值:'測試'cc1-load.sql:171:插入到mytest(mynum) – JIm 2012-07-25 17:24:29