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

时间:2014-04-09 16:09:04

标签: 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

我该怎么办?我在这里找到了答案Split value from one field to two,但这似乎只有在你有分隔符的情况下才有效。

1 个答案:

答案 0 :(得分:1)

仅适用于您在示例中显示的数据:

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

<强> BUT ...

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

INSERT INTO foo VALUES ('E','1.00kg'),('F','02m'),('G','0kg'),('H','10ppm10')

&#34;技巧&#34;查询正在使用的是通过添加零来评估数字上下文中的列权重。 MySQL将返回数值。

真正有用的是获得单位部分。在转换为字符串的数值与weight列中的前导字符串完全匹配的特殊情况下,REPLACE函数可用于将该字符串替换为零长度字符串。我们在SUBSTRING和CHAR_LENGTH函数方面遇到了同样的问题;我没有一个好的解决方案。


获得&#34;单位的更好方法&#34;可以与指定的单位列表进行比较。

     , 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

使用这种方法,检查最长的&#34;是非常重要的。在较短的字符串之前的字符串(例如,如果我们在检查'%l'之前检查了'%ml',我们会返回'l'而不是'ml')。

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