2

我正在尝试创建一个清理表,用整数替换 varchar(50) 字段。原始字段偶尔有我想转换为 0 或空值的文本值。我可以在 select 语句中执行此操作,但在尝试创建表时会出错。

下面是一个使用字符串的最小示例:

/* 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;`

以上有什么问题,有没有更好的方法来完成我想要的?谢谢您的帮助。

4

4 回答 4

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

于 2012-07-25T16:34:57.797 回答
2

我会为它使用一个 case 语句,并切换到使用 CAST 而不是转换,这样你会得到失败而不是隐式转换。

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 实例来测试它,所以希望我没有弄错任何语法错误。

于 2012-07-25T16:45:08.870 回答
0

您可以更新数据然后更改表,而不是转换:

UPDATE mytest SET mynum=mynum + 0;
ALTER TABLE mytest CHANGE COLUMN mynum mynum INT UNSIGNED;
于 2012-07-25T16:38:19.113 回答
0

看起来您正在通过 create 中的 select 语句隐式定义列名。这可能假设“TEST”字符串是数据类型。查看您收到的错误消息会有所帮助,但我的假设是将列明确定义为:

CREATE TABLE mytest(mynum int);

然后

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

这也是为什么子查询的答案可能有效的原因,当它到达外部查询时,它被隐式定义为 int。

于 2012-07-25T16:46:38.223 回答