我想遍历整个表,使用另一列中值的子字符串填充新创建的列的值.
给定一个与以下内容不同的表结构:
+--------+--------------+------+-----+---------+----------------+
| 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的引擎内.
效率在这里很重要,因为我将在生产中执行此操作的表格数十甚至数十万行.
您可以使用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)
请看这里的小提琴.