1

我有一个usersuser_email字段的表。我想替换所有匹配的用户电子邮件:

  • *@a.com
  • *@b.com
  • *@c.com

使用随机选择的字符串

  • d.com
  • 电子商务
  • f.com
  • g.com

例子:

前:

--------------------------------------
|user_name | user_email | user_phone |
--------------------------------------
| greg     | greg@a.com | 12345      |
--------------------------------------
| harry    | harr@b.com | 12345      |
--------------------------------------
| mary     | mary@c.com | 12345      |
--------------------------------------
| john     | john@x.com | 12345      |
--------------------------------------
| fred     | fred@y.com | 12345      |
--------------------------------------
| alfred   | al@a.com   | 12345      |
--------------------------------------

之后(将所有“a.com”、“b.com”、“c.com”替换为从 [“d.com”、“e.com”、“f.com”、“g. com"]:

--------------------------------------
|user_name | user_email | user_phone |
--------------------------------------
| greg     | greg@e.com | 12345      |
--------------------------------------
| harry    | harr@e.com | 12345      |
--------------------------------------
| mary     | mary@f.com | 12345      |
--------------------------------------
| john     | john@x.com | 12345      |
--------------------------------------
| fred     | fred@y.com | 12345      |
--------------------------------------
| alfred   | al@d.com   | 12345      |
--------------------------------------

约翰和弗雷德保持不变。Greg、Harry、Mary 和 Alfred 从 ["d.com", "e.com", "f.com", "g.com"] 随机获得一个。

有关如何执行此操作的任何指示?谢谢

4

2 回答 2

2

如果你正在寻找一个快速而肮脏的解决方案,你可以使用这样的东西:

UPDATE
  emails
SET
  emails.address = CONCAT(SUBSTRING_INDEX(emails.address, '@', 1), '@', ELT(1+rand()*3, 'd.com', 'e.com', 'f.com', 'g.com'))
WHERE
  SUBSTRING_INDEX(address, '@', -1) IN ('a.com', 'b.com', 'c.com')

在此处查看小提琴。

使用SUBSTRING_INDEX(address, '@', -1)你可以得到地址的域部分,你可以检查它是否是a.com、b.com、c.com等。

然后您可以更新您的电子邮件地址,将地址的第一部分SUBSTRING_INDEX(address, '@', -1)、分隔符 @ 和使用 ETL 函数随机选择的域连接起来:

ELT(1+rand()*3, 'd.com', 'e.com', 'f.com', 'g.com')

其中 1+3 是元素的数量。

于 2013-06-30T21:08:22.870 回答
0

我的第一个想法是这样的

UPDATE user
SET user_email = CASE
           WHEN user_email LIKE '%a.com' THEN (SELECT REPLACE(user_email, 'a.com', 'd.com'))
           ELSE user_email
END

或匹配多个域:

UPDATE email
SET user_email = CASE
   WHEN (user_email REGEXP '[a-c].com$') 
   THEN (SELECT CONCAT((SELECT SUBSTRING_INDEX(user_email, '@', 1)), 'y.com' ))
   ELSE user_email
END
于 2013-06-30T21:09:28.420 回答