2011-11-26 51 views
2

两舞伴:如何在MySQL正则表达式+ UPDATE结合的空间添加到名姓

全面问题: 我试图纠正数百记录post_title条目。他们被导入为“JOHNDOE”时,他们应该是“李四”

PART 1日: 在MySQL中,试图SELECT所有匹配小写字母后跟大写[AZ]与:

SELECT `post_title` 
FROM wp_posts 
WHERE `post_title` 
REGEXP '[a-z]\S[A-Z]' 

但是,这也检索'博士John Doe',这实际上是一个正确的入口。我需要它进行检索时,大写直接跟随一个小写的,只有当有字符串中没有任何空间

PART 2号: 我试图通过向再更新这些选定的记录在名字和姓氏之间添加一个空格字符。不知道如何完全用mysql来做到这一点。我确信这是某种疯狂的火星人嵌套的SELECT/UPDATE/WHERE/REGEX语句,但这远远超出了我。

不知道。

谢谢

回答

0

首先,使用REGEXP的模式匹配是不区分大小写的。所以你必须使用BINARY。

我不确定在MySQL中是否有更好的方法来做到这一点,但这是一个。针对从A到Z的每个字母表运行以下查询。我已经为A,B,C,D,E,Y和Z提供了查询。请复制所有其他字母。一旦你完成了运行所有这些,你将有姓和名

UPDATE `wp_posts` 
SET `post_title` = TRIM(REPLACE(`post_title`, 'A', ' A')) 
WHERE `post_title` REGEXP BINARY '[A]'; 

UPDATE `wp_posts` 
SET `post_title` = TRIM(REPLACE(`post_title`, 'B', ' B')) 
WHERE `post_title` REGEXP BINARY '[B]'; 

UPDATE `wp_posts` 
SET `post_title` = TRIM(REPLACE(`post_title`, 'C', ' C')) 
WHERE `post_title` REGEXP BINARY '[C]'; 

UPDATE `wp_posts` 
SET `post_title` = TRIM(REPLACE(`post_title`, 'D', ' D')) 
WHERE `post_title` REGEXP BINARY '[D]'; 

UPDATE `wp_posts` 
SET `post_title` = TRIM(REPLACE(`post_title`, 'E', ' E')) 
WHERE `post_title` REGEXP BINARY '[E]'; 

... 
... 

UPDATE `wp_posts` 
SET `post_title` = TRIM(REPLACE(`post_title`, 'Y', ' Y')) 
WHERE `post_title` REGEXP BINARY '[Y]'; 

UPDATE `wp_posts` 
SET `post_title` = TRIM(REPLACE(`post_title`, 'Z', ' Z')) 
WHERE `post_title` REGEXP BINARY '[Z]'; 

请注意BINARY在上面的查询示例使用之间的空间。

另一种方式可能是编写一个PHP脚本来读取所有post_title,然后使用强大的PHP正则表达式函数来添加空格并将其更新回数据库。

希望这会有所帮助!

编辑:哦!我忘记了数据库也有空格的条目,他们需要被忽略。请使用此查询来代替:

UPDATE `wp_posts` 
SET `post_title` = TRIM(REPLACE(`post_title`, 'A', ' A')) 
WHERE `post_title` REGEXP BINARY '[^ ][A]'; 
+0

非常感谢。 为了简单起见,我最终把你提供的SQL查询放到了一个php循环中。(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U, V,W,X,Y,Z); 的foreach($ ARR AS $值){$ =即updateSQL的sprintf(“UPDATE'wp_posts'
SET'post_title' = TRIM(REPLACE('post_title', '$值', '$值')) WHERE 'post_title' REGEXP BINARY'[^] [$ value]';“); echo“

$ updateSQL

”; mysql_select_db($ database,$ connect); $ Result1 = mysql_query($ updateSQL,$ connect)或die(mysql_error()); } – MaxRocket

+0

这是一个完美的事情@MaxRocket :-) – Abhay