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)吗?如果是,则可以使用查找字符索引以开始拆分。