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

jes*_*ley 5 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    |                |
+--------+--------------+------+-----+---------+----------------+
Run Code Online (Sandbox Code Playgroud)

其中包含的数据类似于:

+----+-------------------------+--------+
| 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   |
+----+-------------------------+--------+
Run Code Online (Sandbox Code Playgroud)

我想要一个查询来解析电子邮件地址的域部分,并将其放在域列中,最终得到如下结果:

+----+-------------------------+-------------------+
| 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      |
+----+-------------------------+-------------------+
Run Code Online (Sandbox Code Playgroud)

目前,我这样做 MySQL的引擎与一个shell脚本的,但是这是低效的,而且我敢肯定,必须有一个更好的办法来做到这一点MySQL的引擎内.

效率在这里很重要,因为我将在生产中执行此操作的表格数十甚至数十万行.

fth*_*lla 8

您可以使用SUBSTRING_INDEX:

SELECT
  id,
  email,
  SUBSTRING_INDEX(email, '@', -1) domain
FROM
  yourtable
Run Code Online (Sandbox Code Playgroud)

或者这个来更新你的数据:

UPDATE yourtable
SET domain = SUBSTRING_INDEX(email, '@', -1)
Run Code Online (Sandbox Code Playgroud)

请看这里的小提琴.