MySQL - 使用同一行中另一列的子字符串填充列

时间:2013-03-26 18:06:14

标签: mysql

我想遍历整个表,使用另一列中值的子字符串填充新创建的列的值。

给定一个与以下内容不同的表结构:

+--------+--------------+------+-----+---------+----------------+
| 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 个答案:

答案 0 :(得分:7)

您可以使用SUBSTRING_INDEX

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

或此更新您的数据:

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

请参阅小提琴here

答案 1 :(得分:2)

update your_table
set domain = SUBSTRING_INDEX(email, '@', -1)
where domain is null;

如果表很大,您应该考虑将更新拆分为块。我建议使用common_schema中的split函数来执行此操作。

答案 2 :(得分:2)

使用SUBSTRING_INDEX

  

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

因此,为了使@右侧的所有内容都可以提供负数:

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

SQL Fiddle

答案 3 :(得分:1)

-1 will give the value after `@`

update tablename set domain = SUBSTRING_INDEX(email, '@', -1)