如果值以逗号分隔,如何将VARCHAR值转换为INT

时间:2019-07-20 00:15:52

标签: mysql

我正在使用的MySQL数据库有一列,其逗号分隔值类似于-

mysql> select * from performance;
+----+------------------+
| id | maximums         |
+----+------------------+
|  1 | 10000RPM, 60KM/h |
|  2 | 5000RPM, 30KM/h  |
|  3 | 25mph, 3000RPM   |
|  4 | 200KM/h, 2000RPM |
+----+------------------+
4 rows in set (0.00 sec)

我正在尝试将找到的数字强制转换为自己的INT列。

mysql> select maximums,  
CASE WHEN maximums like "%mph%" THEN CAST(SUBSTRING_INDEX(maximums, 'mph', 1) AS UNSIGNED) END AS mph_int, 
CASE WHEN maximums like "%KM/h%" THEN CAST(SUBSTRING_INDEX(maximums, 'KM/h', 1) AS UNSIGNED) END AS kmh_int, 
CASE WHEN maximums like "%RPM%" THEN CAST(SUBSTRING_INDEX(maximums, 'RPM', 1) AS UNSIGNED) END AS rpm_int 
from performance;
+------------------+---------+---------+---------+
| maximums         | mph_int | kmh_int | rpm_int |
+------------------+---------+---------+---------+
| 10000RPM, 60KM/h |    NULL |   10000 |   10000 |
| 5000RPM, 30KM/h  |    NULL |    5000 |    5000 |
| 25mph, 3000RPM   |      25 |    NULL |      25 |
| 200KM/h, 2000RPM |    NULL |     200 |     200 |
+------------------+---------+---------+---------+
4 rows in set, 4 warnings (0.00 sec)

我希望输出在新列中将值显示为INT,但是不确定如何实现。

1 个答案:

答案 0 :(得分:0)

让我们使用良好的ol'-fashion钝器方法进行尝试。我猜想您只需要运行一次,即可将设计不佳的旧模式转换为更可行的模式。鉴于此,我在优雅或性能方面不做任何努力。

(如果您不使用它来修复数据模式,则应该这样做,因为您现在所经历的痛苦仅仅是开始。)

首先,我们需要将maximums值分成两部分并分别进行处理。前半部分是:

SUBSTRING_INDEX(`maximum`, ',', 1)

下半部分类似,但是有一个杂散空间:

TRIM(SUBSTRING_INDEX(`maximum`, ',', -1))

从这里开始,我们总是进行修剪,以防数据中出现变化。现在,我们需要查看第一部分中是否包含“ mph”,如果是的话,请按照您在问题中所做的那样捕获值(这本质上类似于您的示例,但仅在maximum值的第一部分进行操作):

IF(TRIM(SUBSTRING_INDEX(`maximum`, ',', 1)) LIKE '%mph', SUBSTRING_INDEX(TRIM(SUBSTRING_INDEX(`maximum`, ',', 1)), 'mph', 1), NULL)

让我们将那段代码命名为“上半年的mph测试”。后半部分的mph测试几乎相同,只是使用-1作为指标。最后,我们需要使用COALESCE将非空值(如果有)放入列中。创建测试的所有六个变体之后,我们将得到以下结果:

SELECT 
    ...
    COALESCE([mph test on first half], [mph test on second half]) AS mph_int, 
    COALESCE([kph test on first half], [kph test on second half]) AS kph_int,
    COALESCE([rpm test on first half], [rpm test on second half]) AS rpm_int
WHERE
    ...

可能您实际上不需要将数字字符串正式转换为整数;如果您要插入具有这些类型的列的表,则MySQL会为您强制转换值。