在MySql中将varchar列值转换为整数

时间:2016-04-21 11:26:28

标签: mysql sql

我们在MySql中有一个表,在该表中我们有一个名为'type'的varchar列。

表有大约5000万条记录。

从日志限制3中选择不同的log_type;

+-------------------+
| type              |
+-------------------+
| EMAIL_SENT        |
| EMAIL_OPEN        |
| AD_CLICKED        |                   
+-------------------+

截至目前,我们有70种不同的类型。将来我们会有更多类型。

现在我们要将此varchar列转换为整数列。

我们想要像下面这样更新

对于EMAIL_SENT我将使用1 对于EMAIL_OPEN,我将使用2 等等

然后结果列将如下

+-------------------+
| type (int)        |
+-------------------+
| 1                 |
| 2                 |
| 3                 |                   
+-------------------+

我们也在更改其他几列,因此我们正在创建新表并从现有表中加载所有值,如下所示

insert into new_table select * from old_table

如何在将值加载到新表时执行此varchar到int转换。

2 个答案:

答案 0 :(得分:0)

只需使用巨人case

insert into new_table(LogTypeId, . . .)
    select (case logtype
                 when 'EMAIL_SENT' then 1
                 when 'EMAIL_OPEN' then 2
                . . .
            end), . . .
    from logs;

创建新表的策略比尝试update现有表更好。

答案 1 :(得分:0)

替代:

ALTER TABLE x MODIFY COLUMN logtype
      ENUM('unk', 'EMAIL_SENT', 'EMAIL_OPEN', ...);

这将是一次传递,每列1个字节,仍显示(用于读/写为字符串)等。

create table so36768171 ( logtype VARCHAR(22) );
INSERT INTO so36768171 VALUES ('EMAIL_SENT'),('EMAIL_SENT'),('EMAIL_OPEN'),('junk');
ALTER TABLE so36768171 MODIFY COLUMN logtype ENUM('unk', 'EMAIL_SENT', 'EMAIL_OPEN');
  Records: 4  Duplicates: 0  Warnings: 1
show warnings;
  +---------+------+----------------------------------------------+
  | Level   | Code | Message                                      |
  +---------+------+----------------------------------------------+
  | Warning | 1265 | Data truncated for column 'logtype' at row 4 |
  +---------+------+----------------------------------------------+
SELECT logtype, 0+logtype FROM so36768171;
  +------------+-----------+
  | logtype    | 0+logtype |
  +------------+-----------+
  | EMAIL_SENT |         2 |
  | EMAIL_SENT |         2 |
  | EMAIL_OPEN |         3 |
  |            |         0 |
  +------------+-----------+
  4 rows in set (0.00 sec)