6

新しく作成された列の値に別の列の値のサブストリングを入力して、テーブル全体を実行したいと思います。

次のようなテーブル構造が与えられます。

+--------+--------------+------+-----+---------+----------------+
| Field  | Type         | Null | Key | Default | Extra          |
+--------+--------------+------+-----+---------+----------------+
| id     | int(11)      | NO   | PRI | NULL    | auto_increment |
| email  | varchar(150) | YES  |     | NULL    |                |
| domain | varchar(100) | YES  |     | NULL    |                |
+--------+--------------+------+-----+---------+----------------+

次のようなデータが含まれています。

+----+-------------------------+--------+
| id | email                   | domain |
+----+-------------------------+--------+
|  1 | bob@domain1.com         | NULL   |
|  2 | jim@domain1.com         | NULL   |
|  3 | terry@domain1.com       | NULL   |
|  4 | frank@anotherdomain.com | NULL   |
|  5 | linda@anotherdomain.com | NULL   |
|  6 | craig@thethird.com      | NULL   |
+----+-------------------------+--------+

メールアドレスのドメイン部分を解析し、それをドメイン列に配置して、次のような結果になるクエリが必要です。

+----+-------------------------+-------------------+
| id | email                   | domain            |
+----+-------------------------+-------------------+
|  1 | bob@domain1.com         | domain1.com       |
|  2 | jim@domain1.com         | domain1.com       |
|  3 | terry@domain1.com       | domain1.com       |
|  4 | frank@anotherdomain.com | anotherdomain.com |
|  5 | linda@anotherdomain.com | anotherdomain.com |
|  6 | craig@thethird.com      | thethird.com      |
+----+-------------------------+-------------------+

現在、シェルスクリプトを使用してMySQLエンジンの外部でこれを行っていますが、これは非効率的であり、MySQLエンジンの内部でこれを行うためのより良い方法があるはずです。

ここでは効率が重要です。これは、本番環境でこれを実行するテーブルが数万行、場合によっては数十万行であるためです。

4

4 に答える 4

10

SUBSTRING_INDEXを使用できます:

SELECT
  id,
  email,
  SUBSTRING_INDEX(email, '@', -1) domain
FROM
  yourtable

またはこれでデータを更新します。

UPDATE yourtable
SET domain = SUBSTRING_INDEX(email, '@', -1)

こちらのフィドルをご覧ください。

于 2013-03-26T18:08:14.057 に答える
2
update your_table
set domain = SUBSTRING_INDEX(email, '@', -1)
where domain is null;

テーブルが大きい場合は、更新をチャンクに分割することを検討する必要があります。splitこれを行うには、common_schemaの関数を使用することをお勧めします。

于 2013-03-26T18:09:53.820 に答える
2

使用SUBSTRING_INDEX

countが負の場合、最後の区切り文字の右側(右から数えて)のすべてが返されます。

したがって、すべてをの右側に配置するには@、負の数を指定できます。

UPDATE YourTable
SET Domain = SUBSTRING_INDEX(email, '@', -1)

SQLフィドル

于 2013-03-26T18:10:41.493 に答える
1
-1 will give the value after `@`

update tablename set domain = SUBSTRING_INDEX(email, '@', -1)
于 2013-03-26T18:10:32.513 に答える