更新 Mysql 表中的电子邮件
Posted
技术标签:
【中文标题】更新 Mysql 表中的电子邮件【英文标题】:Update Email in Mysql table 【发布时间】:2014-08-14 16:21:03 【问题描述】:我的表 USERS 中有很多条目。它包含多达 500 封电子邮件。
例子:
rskidmore@soundviewprep.org
53e935da@mail.com
james.vh@naturescomfortllc.com
arlie@lottapop.com
gigabite10@att.net
我想用“1”后缀更新所有电子邮件。 输出应该是
rskidmore@soundviewprep1.org
53e935da@mail1.com
james.vh@naturescomfortllc1.com
arlie@lottapop1.com
gigabite10@att1.net
这是否可以通过单个查询替换最后一次出现的“。” ???
【问题讨论】:
我认为仅凭查询无法完成。您可能需要使用 php 将1
放在正确的位置
也许可以通过替换最后出现的“.”来完成
@Manwal 不可能。如果 id 是 abc@def.ac.uk
@paradox 很有可能试试这个select replace('rskidmore@soundviewprep.co.uk.id', substring_index(substring_index('rskid.mo.re@soundviewprep.co.uk.id','@',-1),'.',1), concat(substring_index(substring_index('rskid.mo.re@soundviewprep.co.uk.id','@',-1),'.',1),'1') ) as result ;
【参考方案1】:
你可以这样做:
UPDATE `USERS` SET `email` = CONCAT( SUBSTRING(`email`, 1, LENGTH(`email`) -1 -LENGTH(SUBSTRING_INDEX(`email`, '.', -1))), '1.', SUBSTRING_INDEX(`email`, '.', -1));
如果您必须考虑“co.uk”必须是一个牢不可破的单元,您可以使用它(如果您愿意,可以添加更多这样的子域星座):
UPDATE `USERS` SET `email` = IF(
SUBSTRING(`email`,-6)=".co.uk"
, CONCAT(SUBSTRING(`email`,1,LENGTH(`email`)-6), "1.co.uk")
, CONCAT(SUBSTRING(`email`,1,LENGTH(`email`)-1-LENGTH(SUBSTRING_INDEX(`email`, '.', -1))), '1.', SUBSTRING_INDEX(`email`, '.', -1))
);
【讨论】:
试试这个select CONCAT( SUBSTRING('rskid.mo.re@soundviewprep.co.uk', 1, LENGTH('rskid.mo.re@soundviewprep.co.uk') -1 -LENGTH(SUBSTRING_INDEX('rskid.mo.re@soundviewprep.co.uk', '.', -1))), '1.', SUBSTRING_INDEX('rskid.mo.re@soundviewprep.co.uk', '.', -1)) as res ;
@Manwal 如果您将rskid.mo.re@soundviewprep.co.uk
作为您的电子邮件地址,上述内容将为您提供rskid.mo.re@soundviewprep.co1.uk
并且您无法控制电子邮件ID,它可能是任何东西。
@AbhikChakraborty:你的为 xyz@something.co.uk 工作,但不在 xyz@a.b.c.company.net 工作【参考方案2】:
使用CONCAT()
、LENGTH()
和SUBSTRING_INDEX()
非常简单。我已经测试了下面的查询
UPDATE
your_table
SET
email = CONCAT(
SUBSTRING_INDEX(email, '.', 1),
'1.',
IF(
(
LENGTH(email) - LENGTH(REPLACE(email, '.', ''))
) = 2,
SUBSTRING_INDEX(email, '.', - 2),
SUBSTRING_INDEX(email, '.', - 1)
)
) ;
可以参考here,以上mysql函数
此解决方案甚至适用于
test@test.com test@test1.com
test@yahoo.in test@yahoo1.in
test@happy.co.in test@happy1.co.in
【讨论】:
select CONCAT(SUBSTRING_INDEX('rskid.mo.re@soundviewprep.co.uk', '.', 1),'1.',SUBSTRING_INDEX('rskid.mo.re@soundviewprep.co.uk', '.', -1)) as res ;
将失败
是的,正确的@AbhikChakraborty。它不适用于 james.vh@naturescomfortllc1.com。
是的,请尝试与 @ 匹配,因为电子邮件可以有一个 @,然后进行替换。
@Abhik Chakraborty 我的解决方案如何?
@Manwal 检查我的解决方案【参考方案3】:
是的,可以这样做
select
replace('james.vh@naturescomfortllc.com',
substring_index(substring_index('james.vh@naturescomfortllc.com','@',-1),'.',1),
concat(substring_index(substring_index('james.vh@naturescomfortllc.com','@',-1),'.',1),'1')
)
这里有几个测试
mysql> select
-> replace('james.vh@naturescomfortllc.com',
-> substring_index(substring_index('james.vh@naturescomfortllc.com','@',-1),'.',1),
-> concat(substring_index(substring_index('james.vh@naturescomfortllc.com','@',-1),'.',1),'1')
-> ) as result ;
+---------------------------------+
| result |
+---------------------------------+
| james.vh@naturescomfortllc1.com |
+---------------------------------+
1 row in set (0.00 sec)
mysql> select
-> replace('rskidmore@soundviewprep.org',
-> substring_index(substring_index('rskidmore@soundviewprep.org','@',-1),'.',1),
-> concat(substring_index(substring_index('rskidmore@soundviewprep.org','@',-1),'.',1),'1')
->
-> ) as result ;
+------------------------------+
| result |
+------------------------------+
| rskidmore@soundviewprep1.org |
+------------------------------+
mysql> select
-> replace('rskid.mo.re@soundviewprep.co.uk',
-> substring_index(substring_index('rskid.mo.re@soundviewprep.co.uk','@',-1),'.',1),
-> concat(substring_index(substring_index('rskid.mo.re@soundviewprep.co.uk','@',-1),'.',1),'1')
->
-> ) as result ;
+----------------------------------+
| result |
+----------------------------------+
| rskid.mo.re@soundviewprep1.co.uk |
+----------------------------------+
1 row in set (0.00 sec)
所以这里是更新命令
update your_table set email =
replace(
email,
substring_index(substring_index(email,'@',-1),'.',1),
concat(substring_index(substring_index(email,'@',-1),'.',1),'1')
) ;
【讨论】:
我已经测试了这个更新命令,它为“test@test.com”提供了“test1@test1.com”。小提琴-sqlfiddle.com/#!2/6ed6bc/1。为什么会这样? 嗯我知道,它试图用 test1 替换单词 test 所以一旦你有 test@test.com 两者都被替换,这对于真实的电子邮件 ID 不太可能发生,你可能永远不会将电子邮件 ID 视为yahoo@yahoo.com
,gmail@gmail.com
@Manwal:为什么这是最好的答案?这是不对的。此语句将“xyz@a.b.c.company.net”设置为“xyz@a1.b.c.compa1ny.net”。
@hellcode 我对它进行了更多研究,如果您尝试使用 xyz@a1.b.c.compa1ny.co.net
解决方案,它会失败。对于您指定的解决方案,我的解决方案将失败。事实上,任何电子邮件 ID @co.uk 或类似名称都失败了。【参考方案4】:
最好的方法是使用可以轻松完成此操作的脚本语言,拆分字符串,添加“1”,然后将它们连接回来。我不知道它是否只能使用 SQL。这是sql中的追加。 SQL query to prepend prefix to existing value in a field 您也可以使用LIKE
构造正则表达式来识别链接。还有Update a column of a table with append some values to the same column value in MySQL。我认为您将不得不使用这些来创建解决方法
【讨论】:
这不是我想要的。 :(以上是关于更新 Mysql 表中的电子邮件的主要内容,如果未能解决你的问题,请参考以下文章