可以在MySQL中搜索/替换和交换值的位置吗?

时间:2014-01-08 21:25:07

标签: php mysql sql regex

是否可以使用查询来交换SAME值/列中的字符位置?

示例,我有一个大型表,列中列出了大小如下:

12x24 Bulletin

7x14 Bulletin

14x48 Bulletin, etc.

问题是现在我的老板已经决定他想要阅读:

Bulletin 12x24

Bulletin 7x14

Bulletin 14x48

是否可以使用查询或正则表达式交换这些位置?或者我是否必须手动更新每条记录(非常耗时,因为有aprrox。要修改的500条记录)?谢谢你的帮助!

4 个答案:

答案 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