3

私のデータベースには、顧客の名前と情報を含む200000を超えるレコードがあります。顧客名は、名と姓の間に多くのスペースがあります。

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

間にあるスペースを削除するにはどうすればよいですか。お気に入り

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

どんな助けでもありがたいです。

ありがとうございました、

4

4 に答える 4

4

次の回答から取得...そして更新を実行するためにわずかに変更されました:

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つの削除は、|偶数と奇数のスペースを処理します。

于 2012-12-19T19:39:16.233 に答える
1

影響を受ける行が0になるまで、このクエリを数回実行します。

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

このクエリをselectクエリに変換してテストします。結果が満足のいくものである場合は、更新を続行してください。

于 2012-12-19T19:36:54.560 に答える
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)
于 2012-12-19T19:45:56.647 に答える
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 '%  %'

これは、置換を少なくするために、スペース文字のスパンを大きくして拡張できます。置換は、連続するスペース文字の最大スパンから始まり、その後、スペースのすべての出現を可能な限り効率的にキャッチするために、徐々に小さくなります。(これは最も「効率的な」アルゴリズムではありませんが、適切に機能します。)

于 2012-12-19T20:27:47.203 に答える