求SQL语句,UPDATE批量更新

HuoLarry 2014-06-24 07:02:06
元表:T
字段:
Mobile,Q1
1351234567,A-B-C
1313245678,A
1331245678,B-C
1331245679,B-C-D

解释:ABCD分别代表如下客户希望的接触方式
A=微信
B=短信
C=电话
D=邮件

需要得到的结果:
Mobile,Q1
1351234567,微信-短信-电话
1313245678,微信
1331245678,短信-电话
1331245679,短信-电话-邮件
...全文
219 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
HuoLarry 2014-10-15
  • 打赏
  • 举报
回复
引用 9 楼 DVD_01 的回复:
E.g.

use tempdb
go
if object_ID('[fn_Split]') is not null
	Drop function fn_Split
Go
create function fn_Split
(
	@str nvarchar(max),
	@split nvarchar(50)
)
returns @t table(value nvarchar(50))
as
begin
	set @str=@str+@split
	while(1=1)
	begin
		if isnull(@str,'')='' break
		insert into @t(value)values(substring(@str,1,charindex(@split,@str)-1))
		set @str=stuff(@str,1,charindex(@split,@str),'')	
	end
	return 
end
go

------------------------------
if not object_ID('Tempdb..#1') is null drop table #1
Go
Create table #1([Mobile] int,[Q1] nvarchar(5))
Insert #1
select 1351234567,'A-B-C' union all
select 1313245678,'A' union all
select 1331245678,'B-C' union all
select 1331245679,'B-C-D'
Go
if not object_ID('Tempdb..#2') is null drop table #2
Go
Create table #2([Q1] nvarchar(1),[Name] nvarchar(2))
Insert #2
select 'A',N'微信' union all
select 'B',N'短信' union all
select 'C',N'电话' union all
select 'D',N'邮件'
Go
----------------------------
with cte_t1 as 
(
select a.Mobile,c.Name as Q1
	from #1 a 
	 cross apply dbo.fn_Split(a.Q1,'-') as b
	 inner join #2 c on c.Q1=b.value

)
select distinct a.Mobile,b.Q1
	from cte_t1 a
	 cross apply(select stuff((select '-'+x.Q1 from cte_t1 x where x.Mobile=a.Mobile for xml path('')),1,1,'') as Q1
				) b
/*
Mobile		Q1
1313245678	微信
1331245678	短信-电话
1331245679	短信-电话-邮件
1351234567	微信-短信-电话
*/				

高手,老师,这个厉害!!!
Andy-W 2014-06-30
  • 打赏
  • 举报
回复
E.g.

use tempdb
go
if object_ID('[fn_Split]') is not null
	Drop function fn_Split
Go
create function fn_Split
(
	@str nvarchar(max),
	@split nvarchar(50)
)
returns @t table(value nvarchar(50))
as
begin
	set @str=@str+@split
	while(1=1)
	begin
		if isnull(@str,'')='' break
		insert into @t(value)values(substring(@str,1,charindex(@split,@str)-1))
		set @str=stuff(@str,1,charindex(@split,@str),'')	
	end
	return 
end
go

------------------------------
if not object_ID('Tempdb..#1') is null drop table #1
Go
Create table #1([Mobile] int,[Q1] nvarchar(5))
Insert #1
select 1351234567,'A-B-C' union all
select 1313245678,'A' union all
select 1331245678,'B-C' union all
select 1331245679,'B-C-D'
Go
if not object_ID('Tempdb..#2') is null drop table #2
Go
Create table #2([Q1] nvarchar(1),[Name] nvarchar(2))
Insert #2
select 'A',N'微信' union all
select 'B',N'短信' union all
select 'C',N'电话' union all
select 'D',N'邮件'
Go
----------------------------
with cte_t1 as 
(
select a.Mobile,c.Name as Q1
	from #1 a 
	 cross apply dbo.fn_Split(a.Q1,'-') as b
	 inner join #2 c on c.Q1=b.value

)
select distinct a.Mobile,b.Q1
	from cte_t1 a
	 cross apply(select stuff((select '-'+x.Q1 from cte_t1 x where x.Mobile=a.Mobile for xml path('')),1,1,'') as Q1
				) b
/*
Mobile		Q1
1313245678	微信
1331245678	短信-电话
1331245679	短信-电话-邮件
1351234567	微信-短信-电话
*/				

walkeeper 2014-06-30
  • 打赏
  • 举报
回复
同意版主大大4L的说法还是拆开来写吧,便于统计。如果还有其他字段不想数据冗余就建个关联表去存放相关信息吧。
xiaoxiangqing 2014-06-30
  • 打赏
  • 举报
回复
拆分为表来存储效果要高很多。
HuoLarry 2014-06-30
  • 打赏
  • 举报
回复
引用 5 楼 galenkeny 的回复:
[quote=引用 4 楼 ap0405140 的回复:] [quote=引用 3 楼 19850713 的回复:] 这样可以实现,有没有其他方法呢?觉得效率会不会很高,另外如果接触方式达到20项之后,会不会执行效率不高。
这样的表结构设计,查询效率无法高的. 可以考虑修改表结构. 原表 Mobile,Q1 1351234567,A-B-C 新表 Mobile,Q1 1351234567 A 1351234567 B 1351234567 C [/quote] 你这种需求说明原表设计的时候没有考虑到后面的查询统计问题,要不用1楼的方法,要不就截取然后去匹配,反正效率肯定不会高[/quote] 感谢,学习了。
以学习为目的 2014-06-27
  • 打赏
  • 举报
回复
引用 4 楼 ap0405140 的回复:
[quote=引用 3 楼 19850713 的回复:] 这样可以实现,有没有其他方法呢?觉得效率会不会很高,另外如果接触方式达到20项之后,会不会执行效率不高。
这样的表结构设计,查询效率无法高的. 可以考虑修改表结构. 原表 Mobile,Q1 1351234567,A-B-C 新表 Mobile,Q1 1351234567 A 1351234567 B 1351234567 C [/quote] 你这种需求说明原表设计的时候没有考虑到后面的查询统计问题,要不用1楼的方法,要不就截取然后去匹配,反正效率肯定不会高
唐诗三百首 2014-06-27
  • 打赏
  • 举报
回复
引用 3 楼 19850713 的回复:
这样可以实现,有没有其他方法呢?觉得效率会不会很高,另外如果接触方式达到20项之后,会不会执行效率不高。
这样的表结构设计,查询效率无法高的. 可以考虑修改表结构. 原表 Mobile,Q1 1351234567,A-B-C 新表 Mobile,Q1 1351234567 A 1351234567 B 1351234567 C
HuoLarry 2014-06-27
  • 打赏
  • 举报
回复
这样可以实现,有没有其他方法呢?觉得效率会不会很高,另外如果接触方式达到20项之后,会不会执行效率不高。
EverySoft 2014-06-24
  • 打赏
  • 举报
回复

CREATE TABLE #T(Mobile nvarchar(30),Q1 nvarchar(30))
insert into #T(Mobile,Q1) values('1351234567','A-B-C')
insert into #T(Mobile,Q1) values('1313245678','A')
insert into #T(Mobile,Q1) values('1331245678','B-C')
insert into #T(Mobile,Q1) values('1331245679','B-C-D')

select Mobile,replace(replace(replace(replace(Q1,'A','微信'),'B','短信'),'C','电话'),'D','邮件') from #T

drop table #T
EverySoft 2014-06-24
  • 打赏
  • 举报
回复

select Mobile,replace(replace(replace(Q1,'A','微信'),'B','短信'),'C','邮件') from T

34,592

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧