我有一个表有一列,每行包含一个电子邮件地址字符串。我需要从地址字符串中提取每个地址。
表示例:
id | email_id |
123 | 123@gmail.com,123_2@yahooo.com;123@facebook.com |
abc | abc@gmail.com;abc_123@gmail.com;abc@win.com |
900 | 900@gmail.com;900@tin.com;900@facebook.com |
这是从表中选择时预期结果的一个示例:
id | email_id
123 | 123@gmail.com
123 | 123_2@yahooo.com
123 | 123@facebook.com
对于abc和900行,应该会出现相同的结果。
请帮我解决上述问题的SQL查询。
答案 0 :(得分:0)
我会在两个不同的步骤中这样做。
首先拉出每行中的第一个电子邮件地址,然后将其插回到具有相同ID的表格中:
insert into email_address(id, email_id) select id, left(email_id, locate(';', email_id) -1) from email_address where email_id like '%;%';
将如下所示:
id email_address
123 123@gmail.com;123_2@yahooo.com;123@facebook.com
900 900@gmail.com;900@tin.com;900@facebook.com
abc abc@gmail.com;abc_123@gmail.com;abc@win.com
123 123@gmail.com
900 900@gmail.com
abc abc@gmail.com
然后从原始字符串中删除刚刚弹出的电子邮件地址:
update tester.email_address set email_id = substr(email_id, locate(';', email_id) +1) where email_id like '%;%';
将如下所示:
id email_address
123 123_2@yahooo.com;123@facebook.com
900 900@tin.com;900@facebook.com
abc abc_123@gmail.com;abc@win.com
123 123@gmail.com
900 900@gmail.com
abc abc@gmail.com
再次执行相同操作以推送和弹出下一个电子邮件地址,依此类推......
注意:您可能必须运行SET SQL_SAFE_UPDATES = 0;
才能运行更新。
然后你可以运行类似的东西:
select * from email_address order by email_id asc;
以获取价值。