[我知道你们一定能解决]SQL-SERVER求助:关于查询顺次替换输出的问题

fly00990300 2017-07-23 09:31:58
有字段A,数据为30位字符,均是数字,每两位一组,共15组。每组数字有两个状态,00或是它所在的顺序位。如
第一组,是01或00
第二组,是02或00
第三组,是03或00
……
第15组,是15或00

如果各组不是00,则按顺序替换为指定的张三/李四……,如果是00,不显示,如
结果是010203040500000000000000000000,查询结果显示为张三/李四/赵五/钱三/孙大娘
结果是010003000400……,查询结果显示为张三/赵五/孙大娘
结果是0100000……,显示为张三
结果是00000000050000……,显示为/孙大娘

也就是每组如果不是00,就对应显示为固定的名称,是00,不显示任何。

各位大神,怎么实现?万分感谢了。
...全文
276 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
fly00990300 2017-07-24
  • 打赏
  • 举报
回复
引用 3 楼 sinat_28984567 的回复:
创建方法:
CREATE FUNCTION dbo.f_fn(
@str   varchar(8000)  
)RETURNS NVARCHAR(MAX)
AS
BEGIN
DECLARE @i INT = 1
DECLARE @ret NVARCHAR(MAX)=''
WHILE @i<(LEN(@str))
BEGIN
 SELECT @ret += ISNULL((SELECT name FROM T WHERE [code] = SUBSTRING(@str,@i,2))+'/','')
 SET @i=@i+2
END
RETURN STUFF(@ret,LEN(@ret),1,'')
END
GO

测试数据语句:
--测试数据
if not object_id(N'T') is null
	drop table T
Go
Create table T([code] nvarchar(22),[name] nvarchar(23))
Insert T
select N'01',N'张三' union all
select N'02',N'李四' union all
select N'03',N'赵五' union all
select N'04',N'钱三' union all
select N'05',N'孙大娘'
GO
if not object_id(N'Tempdb..#T1') is null
	drop table #T1
Go
Create table #T1([A] nvarchar(50))
Insert #T1
select N'010203040500000000000000000000' union all
select N'010003000400'
Go
--测试数据结束
SELECT dbo.f_fn(A) AS A FROM #T1
结果:
________________________________________ T表不说了,T表是固定的 #T1换成我的T1.AA,变成SELECT dbo.f_fn(AA) AS AA FROM T1 整个变成这样: dbo.f_fn( ) T表 SELECT dbo.f_fn(AA) AS AA FROM T1 我试试。
fly00990300 2017-07-24
  • 打赏
  • 举报
回复
引用 4 楼 keflying 的回复:
[quote=引用 2 楼 fly00990300 的回复:] declare @data varchar(100) = '0102000405' 改成declare @data varchar(100) =字段A 就可以对字段A的数据进行替换了吧?
对的。[/quote] —————————————————————————— 运行了一下,报错,似乎提示找不到T1.AA?请确认一下我改的语句是否有问题? 将@data替换为T1表中的AA字段,改为如下: Create table #Tem(ID int,Nick nvarchar(100)) insert into #Tem values(1,'张三') insert into #Tem values(2,'李四') insert into #Tem values(3,'赵五') insert into #Tem values(4,'钱三') insert into #Tem values(5,'孙大娘') declare @data varchar(100) select @data =T1.AA FROM T1 where..... declare @Count int = 0,@i int = 0 select @Count = count(*) from #Tem while @i<@Count Begin set @i = @i + 1 select @data = REPLACE(@data,right('0'+Cast(ID as varchar(10)),2),Nick) from #Tem End select Replace(@data,'00','') 我就是想将T1.AA字段的输出结果都进行上述替换。
fly00990300 2017-07-23
  • 打赏
  • 举报
回复
declare @data varchar(100) = '0102000405' 改成declare @data varchar(100) =字段A 就可以对字段A的数据进行替换了吧?
keflying 2017-07-23
  • 打赏
  • 举报
回复
Create table #Tem(ID int,Nick nvarchar(100)) insert into #Tem values(1,'张三') insert into #Tem values(2,'李四') insert into #Tem values(3,'赵五') insert into #Tem values(4,'钱三') insert into #Tem values(5,'孙大娘') declare @data varchar(100) = '0102000405' declare @Count int = 0,@i int = 0 select @Count = count(*) from #Tem while @i<@Count Begin set @i = @i + 1 select @data = REPLACE(@data,right('0'+Cast(ID as varchar(10)),2),Nick) from #Tem End select Replace(@data,'00','') --------------------结果 张三李四钱三孙大娘 你可以随便改到Data的数据,即可获取你要的结果
keflying 2017-07-23
  • 打赏
  • 举报
回复
引用 2 楼 fly00990300 的回复:
declare @data varchar(100) = '0102000405' 改成declare @data varchar(100) =字段A 就可以对字段A的数据进行替换了吧?
对的。
二月十六 2017-07-23
  • 打赏
  • 举报
回复
创建方法:
CREATE FUNCTION dbo.f_fn(
@str varchar(8000)
)RETURNS NVARCHAR(MAX)
AS
BEGIN
DECLARE @i INT = 1
DECLARE @ret NVARCHAR(MAX)=''
WHILE @i<(LEN(@str))
BEGIN
SELECT @ret += ISNULL((SELECT name FROM T WHERE [code] = SUBSTRING(@str,@i,2))+'/','')
SET @i=@i+2
END
RETURN STUFF(@ret,LEN(@ret),1,'')
END
GO



测试数据语句:
--测试数据
if not object_id(N'T') is null
drop table T
Go
Create table T([code] nvarchar(22),[name] nvarchar(23))
Insert T
select N'01',N'张三' union all
select N'02',N'李四' union all
select N'03',N'赵五' union all
select N'04',N'钱三' union all
select N'05',N'孙大娘'
GO
if not object_id(N'Tempdb..#T1') is null
drop table #T1
Go
Create table #T1([A] nvarchar(50))
Insert #T1
select N'010203040500000000000000000000' union all
select N'010003000400'
Go
--测试数据结束
SELECT dbo.f_fn(A) AS A FROM #T1


结果:

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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