我想遍历整个表,使用另一列中值的子字符串填充新创建的列的值。
给定一个与以下内容不同的表结构:
+--------+--------------+------+-----+---------+----------------+
| 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引擎内部必须有更好的方法
效率在这里很重要,因为我将在生产中执行此操作的表格数十甚至数十万行。
答案 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)
如果count为负数,则最终分隔符右侧的所有内容 (从右边算起)返回。
因此,为了使@
右侧的所有内容都可以提供负数:
UPDATE YourTable
SET Domain = SUBSTRING_INDEX(email, '@', -1)
答案 3 :(得分:1)
-1 will give the value after `@`
update tablename set domain = SUBSTRING_INDEX(email, '@', -1)