Mysql:用数字和字母将一列拆分为两列

Mysql:用数字和字母将一列拆分为两列,mysql,regex,string,database-design,Mysql,Regex,String,Database Design,我有一张这样的桌子: Product|weight A |5kg B |5.2kg C |3.9kg D |6l Product|weight|unit A |5 |kg B |5.2 |kg C |3.9 |kg D |6 |l 我希望将第二列拆分为如下所示的表: Product|weight A |5kg B |5.2kg C

我有一张这样的桌子:

Product|weight
A      |5kg
B      |5.2kg
C      |3.9kg
D      |6l
   Product|weight|unit
    A      |5    |kg
    B      |5.2  |kg
    C      |3.9  |kg
    D      |6    |l
我希望将第二列拆分为如下所示的表:

Product|weight
A      |5kg
B      |5.2kg
C      |3.9kg
D      |6l
   Product|weight|unit
    A      |5    |kg
    B      |5.2  |kg
    C      |3.9  |kg
    D      |6    |l

我该怎么做?我在这里找到了答案,但这似乎只有在有分隔符的情况下才起作用。

对于示例中显示的数据:

CRATE TABLE foo (product varchar(7), weight varchar(7));
INSERT INTO foo VALUES ('A','5kg'),('B','5.2kg'),('C','3.9kg'),('D','6l')
这将有助于:

SELECT t.product
     , t.weight
     , t.weight + 0 AS num
     , REPLACE(t.weight,t.weight+0,'') AS unit
  FROM foo t
但是…

这在更一般的情况下不起作用,请考虑:

INSERT INTO foo VALUES ('E','1.00kg'),('F','02m'),('G','0kg'),('H','10ppm10')
查询使用的“技巧”是通过添加一个零来计算数值上下文中的列权重。MySQL将返回数值

真正不起作用的是得到单位部分。在转换为字符串的数值与
weight
列中的前导字符串完全匹配的特殊情况下,可以使用REPLACE函数将该字符串替换为零长度字符串。我们在子串和字符长度函数上也有同样的问题;我没有一个好的解决办法


获取“单位”的更好方法可能是与指定的单位列表进行比较

     , CASE
       WHEN t.weight LIKE '%kg'  THEN 'kg'
       WHEN t.weight LIKE '%g'   THEN 'g'
       WHEN t.weight LIKE '%ml'  THEN 'ml'
       WHEN t.weight LIKE '%l'   THEN 'l'
       ELSE ''
       END AS unit
使用这种方法,在短字符串之前检查“最长”字符串是很重要的(例如,如果我们在检查
'%ml'
之前检查
'%l'
,我们将返回
'l'
,而不是
'ml'


注意MySQL
REGEXP
操作符是有限的,它只返回一个布尔值;指示表达式是否与模式匹配,它不会返回与模式匹配的位置或字符串的一部分。

您知道所有不同的定义单位(如kg/l)吗?如果是,则可以使用查找字符索引以开始拆分。