如何使用SQL从格式化的字母数字字符串中提取第一个和第二个数字?

时间:2016-11-22 23:28:44

标签: mysql sql regex string replace

weight列中的示例数据(来自3行数据)

+-------------------------+
| weight                  |
+-------------------------+
| Pump:398kg Motor:0kg    |
| Pump:448# Motor:997#    |
| Pump:355kg Motor:2495kg |
+-------------------------+

有没有办法从列中提取第一个数字,并在列中分别提取第二个数字?

请注意

  • 字符串始终以Pump:
  • 开头
  • 字符串Motor:将始终位于中间
  • 面额分隔符为#kg,没有其他人
  • 重量总是一个整数

我的目标是将每个数字分成各自的列

UPDATE table set weight_pump = ?, weight_motor = ?
UPDATE table set weight_pump = 398, weight_motor = 0

我可以用PHP解决这个问题(SELECT每行,做REGEX提取数字,写回行)

但我正在寻找的是纯SQL解决方案,如果存在的话。最好是单个SQL语句,如果存在,但我不反对几个语句或中间步骤。

我已经看到了其他答案,但他们专注于从SQL中提取单个数字,我正在寻找更强大的东西。

注意:它也可以分两步完成(一个用于" kg"一个用于"#")以简化查询。

1 个答案:

答案 0 :(得分:2)

这是一个使用substring_index()的解决方案。

我喜欢这个功能,因为它不太依赖特定的角色位置。

mysql> SELECT
  SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(weight, ':', -2), 'kg', 1), '#', 1) AS weight_pump,
  SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(weight, ':', -1), 'kg', 1), '#', 1) AS weight_motor 
FROM MyTable;

输出:

+-------------+--------------+
| weight_pump | weight_motor |
+-------------+--------------+
| 398         | 0            |
| 448         | 997          |
| 355         | 2495         |
+-------------+--------------+

这也适用于UPDATE:

mysql> UPDATE MyTable
  SET weight_pump = SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(weight, ':', -2), 'kg', 1), '#', 1),
      weight_motor = SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(weight, ':', -1), 'kg', 1), '#', 1);

在此处详细了解此功能:http://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_substring-index