我有两个包含
等值的MySQL表表1
id email_id
===========
1 abc@xyz.com
2 bbc@xy.com
3 gty@xyz.com
4 iut@xyz.com
5 tyk@xy.com
表2
id name email_id
===========
1 abc abc@xy.com
2 bbc bbc@xy.com
3 gty gty@xy.com
4 iut iut@xy.com
5 tyk tyk@xy.com
6 tyr tyr@xy.com
7 iut iut@xy.com
结果
表2
id name email_id
===========
1 abc abc@xyz.com
2 bbc bbc@xy.com
3 gty gty@xyz.com
4 iut iut@xyz.com
5 tyk tyk@xy.com
6 tyr tyr@xy.com
7 iut iut@xyz.com
您可以在我的第一个表格中看到@ xy.com和@ xyz.com的组合。所以我需要在table2中将所有@ xy.com更改为@ xyz.com,无论table1是否与@ xyz.com相同。
示例:table1中的case1- abc@xyz.com可用及其@xyz格式,因此在table2中我需要将其更改为abc@xyz.com
表1中的case2- bbc@xy.com是可用的,它是@xy格式的,所以在table2中我不需要更改bbc@xyz.com。我可以保持原样。答案 0 :(得分:0)
您可以将table1
和table2
加在一起,然后比较每个id
的电子邮件地址长度。由于您希望有条件地将@xy
格式替换为@xyz
格式,因此您只需选择更长电子邮件地址即可保留在查询中。
SELECT t2.id, t2.name,
CASE WHEN CHAR_LENGTH(t2.email_id) > CHAR_LENGTH(COALESCE(t1.email_id, ''))
THEN t2.email_id ELSE t1.email_id END AS email_id
FROM table2 t2 LEFT JOIN table1 t1 ON t2.id = t1.id
答案 1 :(得分:0)
我用sql server编写
create table #stack_table1(id int identity(1,1),
email_id varchar(1000))
create table #stack_table2(id int ,
name varchar(50),
email_id varchar(1000)
)
insert into #stack_table1(email_id)
(select ('abc@xyz.com')
union
select ('bbc@xy.com')
union
select ('gty@xyz.com')
union
select ('iut@xyz.com')
union
select ('tyk@xy.com')
)
insert into #stack_table2(id,name,email_id)
(
select 1,'abc','abc@xy.com'
union
select 2,'bbc','bbc@xy.com'
union
select 3,'gty','gty@xy.com'
union
select 4,'iut','iut@xy.com'
union
select 5,'tyk','tyk@xy.com'
union
select 6,'tyr','tyr@xy.com'
union
select 7,'iut','iut@xy.com'
)
select * from #stack_table1
select * from #stack_table2
表已创建
更新声明如下
UPDATE st2
SET st2.email_id = st1.email_id
FROM #stack_table1 st1
JOIN #stack_table2 st2 ON st2.NAME = substring(st1.email_id, 1, CHARINDEX('@', st1.email_id, 1) - 1)
如果只需要选择查询,请使用此
SELECT st2.id
,st2.NAME
,coalesce(st1.email_id, st2.email_id)
FROM #stack_table1 st1
RIGHT JOIN #stack_table2 st2 ON st2.NAME = substring(st1.email_id, 1, CHARINDEX('@', st1.email_id, 1) - 1)