如何使用名称字段中的单个空格更新mySQL中的200000条记录

时间:2012-12-19 19:29:44

标签: mysql phpmyadmin

我的数据库中有超过200000条记录,包含客户名称和信息。 客户名称在名字和姓氏之间有很大的空间。

ex.  1.ADAMS         CRAIG
     2. GABRIEL       GEANETTE
     3. KRANTZ        AUDREY

如何删除其间的空格。像

ex.  1.ADAMS CRAIG
     2.GABRIEL GEANETTE
     3.KRANTZ AUDREY

任何帮助都会受到赞赏。

谢谢,

4 个答案:

答案 0 :(得分:4)

Taken from the following answer ...并略微修改以执行更新:

UPDATE YourTable
SET Name = 
        replace(
          replace(
             replace(
                LTrim(RTrim(Name)),         --Trim the field
             '  ',' |'),                    --Mark double spaces
          '| ',''),                         --Delete double spaces offset by 1
       '|','')                              --Tidy up
WHERE Name LIKE '%  %'

所以在你的例子中......

ADAMS         CRAIG

会变成......

ADAMS | | | | CRAIG

一旦删除了特殊的|令牌,就会变成......

ADAMS CRAIG

最后一次移除|将处理奇数个空格。

答案 1 :(得分:1)

运行此查询几次,直到受影响的行变为0。

UPDATE tbl
SET    col = TRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(col, '  ', ' '), '  ', ' '), '  ', ' '), '  ', ' '), '  ', ' '))
WHERE  col LIKE '%  %'

将此查询转换为选择查询和测试。如果结果令人满意,请继续进行更新。

答案 2 :(得分:1)

mysql> select name from tmp;
+------------------------+
| name                   |
+------------------------+
| ADAMS         CRAIG    |
| GABRIEL       GEANETTE |
| KRANTZ        AUDREY   |
+------------------------+
3 rows in set (0.00 sec)

mysql> select concat(substr(name,1,locate(' ',name)), trim(substr(name,locate(' ', name)))) from tmp;
+-------------------------------------------------------------------------------+
| concat(substr(name,1,locate(' ',name)), trim(substr(name,locate(' ', name)))) |
+-------------------------------------------------------------------------------+
| ADAMS CRAIG                                                                   |
| GABRIEL GEANETTE                                                              |
| KRANTZ AUDREY                                                                 |
+-------------------------------------------------------------------------------+
3 rows in set (0.00 sec)

答案 3 :(得分:0)

作为所选答案的替代方法,此语句将从列中删除连续空格字符的跨度,并用单个空格字符替换空格。这仅对空格字符起作用,并且不需要任何特殊的“标记”字符(并且不要求特殊的“标记”字符不出现在源列中。

UPDATE mytable
   SET mycol =
       REPLACE(
       REPLACE(
       REPLACE(
       REPLACE(
       REPLACE(
       REPLACE(
         mycol
       ,SPACE(21),' ')
       ,SPACE(13),' ')
       ,SPACE(8),' ')
       ,SPACE(5),' ')
       ,SPACE(3),' ')
       ,SPACE(2),' ')
 WHERE mycol LIKE '%  %'

要将此表达式作为测试运行,请在SELECT语句中使用它:

SELECT REPLACE(
       REPLACE(
       REPLACE(
       REPLACE(
       REPLACE(
       REPLACE(
         mycol
       ,SPACE(21),' ')
       ,SPACE(13),' ')
       ,SPACE(8),' ')
       ,SPACE(5),' ')
       ,SPACE(3),' ')
       ,SPACE(2),' ') AS new_mycol
    FROM mytable t
   WHERE t.mycol LIKE '%  %'

这可以通过更大的SPACE字符范围进行扩展,以减少替换次数。替换从最大的连续空间字符跨度开始,然后替换逐渐变小,以尽可能有效地捕获所有空间的出现。 (这不是最“有效”的算法,但它适用。)