我有一张这样的表:
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,但这似乎只有在你有分隔符的情况下才有效。
答案 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
运算符是有限的,它只返回一个布尔值;指示表达式是否与模式匹配,它不会返回与模式匹配的位置或字符串的一部分。