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      |
+----+-------------------------+-------------------+

目前,我正在使用 shell 脚本在 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

使用SUBSTRING_INDEX

如果 count 为负数,则返回最终分隔符右侧(从右侧开始计数)的所有内容。

因此,要将所有内容都放在 的右侧@,您可以提供一个负数:

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

SQL小提琴

于 2013-03-26T18:10:41.493 回答
2
update your_table
set domain = SUBSTRING_INDEX(email, '@', -1)
where domain is null;

如果表很大,您应该考虑将更新分成块。我建议使用splitcommon_schema 中的函数来做到这一点。

于 2013-03-26T18:09:53.820 回答
1
-1 will give the value after `@`

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