我将以下内容导入TableA,列'衣服'和列'颜色'
问题是导入已放入'衣服'栏目'牛仔裤 - 蓝色'和'跳线 - 红色'等等
请有人帮我查询一下 - 在'衣服'之后的所有内容以及之后的所有内容 - 进入'颜色'并完全删除 -
答案 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
请注意,如果我们在为“颜色”列指定值之前分配“衣服”列,则我们要分配给“颜色”的值将“丢失”。