【问题标题】:Converting varchar column values into integer in MySql在MySql中将varchar列值转换为整数
【发布时间】:2016-04-21 11:26:27
【问题描述】:

我们在 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 的转换。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    就用大号case

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

    创建新表的策略比尝试update 现有表要好得多。

    【讨论】:

    【解决方案2】:

    替代方案:

    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)
    

    【讨论】:

      猜你喜欢
      • 2014-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-01
      • 2013-04-18
      • 2013-09-08
      • 1970-01-01
      • 2014-08-16
      相关资源
      最近更新 更多