我正在使用的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,但是不确定如何实现。
答案 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会为您强制转换值。