MySQL将一部分单元格移动到另一列

时间:2013-04-03 18:59:29

标签: mysql sql

我将以下内容导入TableA,列'衣服'和列'颜色'

问题是导入已放入'衣服'栏目'牛仔裤 - 蓝色'和'跳线 - 红色'等等

请有人帮我查询一下 - 在'衣服'之后的所有内容以及之后的所有内容 - 进入'颜色'并完全删除 -

3 个答案:

答案 0 :(得分:0)

这两个步骤。

首先,更新颜色:

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,但我通常在这些情况下使用它来避免不必要的空格。

肯定有更直接的方法可以做到这一点,但这会有效。

答案 1 :(得分:0)

您可以在单个UPDATE中执行以下操作:

UPDATE TableA
SET `Colours` = SUBSTRING_INDEX(`Clothes`, ' - ', -1),
    `Clothes` = SUBSTRING_INDEX(`Clothes`, ' - ', 1)
;

您可以试验我根据您的数据创建的SQL Fiddle Demo

以下是我使用过的数据:

CREATE TABLE 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

答案 2 :(得分:0)

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

请注意,如果我们在为“颜色”列指定值之前分配“衣服”列,则我们要分配给“颜色”的值将“丢失”。