我将以下内容导入 TableA,列“衣服”和“颜色”列
问题是导入已放入“衣服”列“牛仔裤 - 蓝色”和“跳线 - 红色”等
请有人帮我查询,以将 - 之前的所有内容保留在“衣服”中,将 - 之后的所有内容保留为“颜色”,并完全删除 -。
您可以UPDATE
按如下方式一次性完成:
UPDATE TableA
SET `Colours` = SUBSTRING_INDEX(`Clothes`, ' - ', -1),
`Clothes` = SUBSTRING_INDEX(`Clothes`, ' - ', 1)
;
您可以使用我根据您的数据创建的SQL Fiddle Demo进行试验。
这是我使用的数据:
创建表 TableA ( Clothes
varchar(20), Colours
varchar(20)) ;
INSERT INTO TableA
(`Clothes`, `Colours`)
VALUES
('Jeans - Blue', NULL),
('Jumper - Red', NULL)
;
这是结果SELECT * FROM TableA;
:
CLOTHES COLOURS
Jeans Blue
Jumper Red
SUBSTRING_INDEX
功能方便,功能TRIM
可以去除前导和尾随空格。例如:
SELECT TRIM(SUBSTRING_INDEX(a.Clothes,'-',1)) AS Clothes
, TRIM(SUBSTRING_INDEX(a.Clothes,'-',-1)) AS Colours
FROM TableA a
WHERE LENGTH(a.Clothes)-LENGTH(REPLACE(a.Clothes,'-','')) = 1
(注意:上面的查询在第一个“-”字符之前返回子字符串,并在最后一个“-”字符之后返回子字符串。因此,任何具有多个破折号的值都会丢失第一个和最后一个破折号之间的部分,考虑例如'A - B - C - D',上面的查询返回A并返回D,并丢失其他所有内容。
为了处理这种异常,WHERE 子句检查字符串是否包含单次出现的“-”字符。
一旦有了满意的查询,就可以将其转换为 UPDATE 语句,但要非常小心为列分配新值的顺序。与其他关系数据库不同,MySQL 不保证对语句中现有列的引用将是语句开头的列的值......唯一的保证是它将是当前分配的值。因此,分配列的顺序很重要!
UPDATE TableA a
SET Colours = TRIM(SUBSTRING_INDEX(a.Clothes,'-',-1))
, Clothes = TRIM(SUBSTRING_INDEX(a.Clothes,'-',1))
WHERE LENGTH(a.Clothes)-LENGTH(REPLACE(a.Clothes,'-','')) = 1
请注意,如果我们在为 Colors 列分配值之前分配 Clothes 列,那么我们希望分配给 Colors 的值将“丢失”。
两个步骤。
首先,更新颜色:
UPDATE yourTableA T
SET T.Colours = TRIM(SUBSTR(T.Clothes,INSTR(T.Clothes,'-') + 2));
二、更新衣服:
UPDATE yourTableA T
SET T.Clothes = TRIM(SUBSTR(T.Clothes,1,INSTR(T.clothes,'-')-1));
我在SUBSTR
这里用作我的弦瑞士军刀,并INSTR
在两者之间找到 - 的位置。你可以不用TRIM
,但我通常在这些情况下使用它来避免不必要的空格。
肯定有更直接的方法可以做到这一点,但这会奏效。