是否可以使用查询来交换SAME值/列中的字符位置?
示例,我有一个大型表,列中列出了大小如下:
12x24 Bulletin
7x14 Bulletin
14x48 Bulletin, etc.
问题是现在我的老板已经决定他想要阅读:
Bulletin 12x24
Bulletin 7x14
Bulletin 14x48
是否可以使用查询或正则表达式交换这些位置?或者我是否必须手动更新每条记录(非常耗时,因为有aprrox。要修改的500条记录)?谢谢你的帮助!
答案 0 :(得分:1)
这两个值之间总是一个空白吗?如果是,您可以选择以下记录:
SELECT CONCAT(SUBSTRING_INDEX(details, ' ', -1),' ',SUBSTRING_INDEX(details, ' ', 1)) AS value FROM tableName
SQL小提琴:http://sqlfiddle.com/#!2/a04d8d/6
我使用的此查询的表架构:
CREATE TABLE tableName (
id int auto_increment primary key,
details varchar(30));
INSERT INTO tableName (id, details)
VALUES (NULL,'12x24 Bulletin'), (NULL,'7x14 Bulletin');
答案 1 :(得分:1)
这对我来说似乎很自然,虽然不太灵活:
UPDATE SOMETABLE
SET SOMECOLUMN = CONCAT('Bulletin ', REPLACE(SOMECOLUMN, ' Bulletin', ''))
WHERE SOMECOLUMN LIKE '% Bulletin'
;
答案 2 :(得分:0)
如果这些示例成立,那么您可以通过执行以下操作进行交换:
update t
set col = ws_concat(' ', substring_index(col, ' ', -1), substring_index(col, ' ', 1)
where col like '% Bulletin';
或者,您可以在查询列时执行此操作:
select ws_concat(' ', substring_index(col, ' ', -1), substring_index(col, ' ', 1) as size,
<other columns
from t;
然而,问题的存在表明您将两种类型的信息填充到一列中。您应该考虑使用两列 - 在您的情况下,一列将包含'Bulletin'
(某种“sizetype”列),另一列将具有维度。您甚至可能希望将维度拆分为其他列。
实际上,在我写这篇文章时,我怀疑你在数据库中缺少实体。该列实际上应该是sizes
表的外键。该表每个大小的thingee将有一行。然后,您可以使用各种列来表示适合您,您的老板,老板的老板或任何人的大小。
答案 3 :(得分:0)
是。这是可能的。
“技巧”是编写一个表达式,返回要分配的新值。
看起来您可以通过查找' Bulletin'
的匹配项并将其替换为空字符串,并使用'Bulletin '
预先保留剩余值来实现您想要的效果。
这是一个示范......
-- test cases
CREATE TABLE foo (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, mycol VARCHAR(255))
INSERT INTO foo (mycol) VALUES ('12x24 Bulletin'),('7x14 Bulletin'),('14x48 Bulletin')
-- test expression to return new value to be assigned
SELECT mycol AS oldval
, CONCAT('Bulletin ',REPLACE(mycol,' Bulletin','')) AS newval
FROM foo
WHERE mycol LIKE '% Bulletin%'
-- use that expression in an UPDATE statement to replace the value
UPDATE foo
SET mycol = CONCAT('Bulletin ',REPLACE(mycol,' Bulletin',''))
WHERE mycol LIKE '% Bulletin%'
在UPDATE语句中需要注意一些问题,例如在为表达式赋值之后引用表达式中的列。 (在我上面给出的例子中不是问题,但它可以是更一般的情况。
注意:MySQL REGEXP运算符返回一个布尔值,而不是一个字符串函数,所以,不,你不能“使用正则表达式”来返回一个替换值。您可以在上面的示例中使用REGEXP代替LIKE运算符。
以上假设您要更新存储在表中的值。如果您只想在拉取数据时进行修改,可以使用SELECT列表中的表达式,类似于上面的内容。
INSERT INTO foo (mycol) VALUES ('Stapler 12')
SELECT IF(mycol LIKE '% Bulletin'
,CONCAT('Bulletin ',REPLACE(mycol,' Bulletin',''))
,mycol
) AS mycol
FROM foo