MYSQL用随机选择的字符串数组替换字符串数组

时间:2013-06-30 20:54:19

标签: mysql sql

我有一个users表,其中包含user_email字段。我想替换所有匹配的用户电子邮件:

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

使用

中随机选择的字符串
  • d.com
  • e.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      |
--------------------------------------

之后(用“d.com”,“e.com”,“f.com”随机选择一个替换所有“a.com”,“b.com”,“c.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”]中获得一个。

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

2 个答案:

答案 0 :(得分: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')

请参阅小提琴here

使用SUBSTRING_INDEX(address, '@', -1)您可以获得该地址的域名部分,您可以查看它是a.com,b.com,c.com等。

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

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

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

答案 1 :(得分: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