求一查询语句!

Jonly 2004-06-16 05:29:45
--测试数据
create table tblN(NoID int,Rows int,DataS varchar(100))
insert tblN select 1,1,'A1,A2,A3'
union all select 2,2,'A1,A2,A3'
union all select 3,3,'A1,A2,A3'
union all select 4,1,'B1,B2,B3,B4'
union all select 5,2,'B1,B2,B3,B4'
union all select 6,3,'B1,B2,B3,B4'
union all select 7,4,'B1,B2,B3,B4'
union all select 8,1,'C1,C2'
union all select 9,2,'C1,C2'
union all select 10,1,'D1,'
union all select 11,2,'D1,'
go


想得到以下的结果:
Noid Rows DataS
1 1 A1
2 2 A2
3 3 A3
4 1 B1
5 2 B2
6 3 B3
7 4 B4
8 1 C1
9 2 C2
10 1 D1
11 2 NULL

--------------
就是想根据Rows字段的值来提取DataS里面对应的第几个值。
DataS里面的值都是用","号分开的。
特别注意的是:如果根据Rows某一个值在DataS里没找对应的值,则查询结果的这一条记录的DataS值为空(NULL)。

不知道我有没说清楚。
敬请各位帮忙!谢谢!
...全文
115 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jonly 2004-06-17
  • 打赏
  • 举报
回复
太感谢各位了!
祝你们开心
internetcsdn 2004-06-16
  • 打赏
  • 举报
回复
--测试数据
create table tblN(NoID int,Rows int,DataS varchar(100))
insert tblN select 1,1,'A1,A2,A3'
union all select 2,2,'A1,A2,A3'
union all select 3,3,'A1,A2,A3'
union all select 4,1,'B1,B2,B3,B4'
union all select 5,2,'B1,B2,B3,B4'
union all select 6,3,'B1,B2,B3,B4'
union all select 7,4,'B1,B2,B3,B4'
union all select 8,1,'C1,C2'
union all select 9,2,'C1,C2'
union all select 10,1,'D1,'
union all select 11,2,'D1,'
go


select *,n_datas=case right(datas,1) when ','
then left(datas,len(datas)-1) else datas end
,left(datas,1)+cast(rows as varchAR(50)) as left2
into #t
from tbln a

select noid,rows,a =case when rows <=cast(right(n_datas,1) as int)
then left2 else null end from #t

drop table tbln,#t

/*
noid rows a
--------------------------------------
1 1 A1
2 2 A2
3 3 A3
4 1 B1
5 2 B2
6 3 B3
7 4 B4
8 1 C1
9 2 C2
10 1 D1
11 2 NULL

*/

internetcsdn 2004-06-16
  • 打赏
  • 举报
回复
select *,n_datas=case right(datas,1) when ','
then left(datas,len(datas)-1) else datas end
,left(datas,1)+cast(rows as varchAR(50)) as left2
into #t
from tbln a

select noid,rows,a =case when rows <=cast(right(n_datas,1) as int)
then left2 else null end from #t
zjcxc 元老 2004-06-16
  • 打赏
  • 举报
回复
--测试数据
create table tblN(NoID int,Rows int,DataS varchar(100))
insert tblN select 1,1,'A1,A2,A3'
union all select 2,2,'A1,A2,A3'
union all select 3,3,'A1,A2,A3'
union all select 4,1,'B1,B2,B3,B4'
union all select 5,2,'B1,B2,B3,B4'
union all select 6,3,'B1,B2,B3,B4'
union all select 7,4,'B1,B2,B3,B4'
union all select 8,1,'C1,C2'
union all select 9,2,'C1,C2'
union all select 10,1,'D1,'
union all select 11,2,'D1,'
go

--创建一个处理函数,得到第n个,分隔字符串的字符值
create function f_split(
@rows int,
@DataS varchar(100)
)returns varchar(100)
as
begin
declare @i int

set @i=charindex(',',@DataS)
while @i>0 and @rows>1
select @DataS=substring(@DataS,@i+1,8000)
,@i=charindex(',',@DataS)
,@rows=@rows-1
return(case @rows when 1
then case when @i>0 then left(@DataS,@i-1) else @DataS end
else NULL end)
end
go

--调用函数进行查询处理
select Noid,Rows,DataS=dbo.f_split(Rows,DataS)
from tblN
go

--删除测试
drop table tblN
drop function f_split

/*--测试结果

Noid Rows DataS
----------- ----------- --------
1 1 A1
2 2 A2
3 3 A3
4 1 B1
5 2 B2
6 3 B3
7 4 B4
8 1 C1
9 2 C2
10 1 D1
11 2

(所影响的行数为 11 行)
--*/--*/
dlkfth 2004-06-16
  • 打赏
  • 举报
回复
虽然不通用,不知道是否适合你
zjcxc 元老 2004-06-16
  • 打赏
  • 举报
回复
--创建一个处理函数,得到第n个,分隔字符串的字符值
create function f_split(
@rows int,
@DataS varchar(100)
)returns varchar(100)
as
begin
declare @i int

set @i=charindex(',',@DataS)
while @i>0 and @rows>1
select @DataS=substring(@DataS,@i+1,8000)
,@i=charindex(',',@DataS)
,@rows=@rows-1
return(case @rows when 1
then case when @i>0 then left(@DataS,@i-1) else @DataS end
else NULL end)
end
go

--调用函数进行查询处理
select Noid,Rows,DataS=dbo.f_split(Rows,DataS)
from tblN
dlkfth 2004-06-16
  • 打赏
  • 举报
回复
select NoID,Rows,SUBSTRING (datas ,charindex(ltrim(rtrim(cast(rows as varchar(20))))+'''',DataS) -1 ,2) from tblN
czhenq 2004-06-16
  • 打赏
  • 举报
回复
学习
dlkfth 2004-06-16
  • 打赏
  • 举报
回复
写个自定义函数,解决没有问题,不只到是否有更好的方法?

34,587

社区成员

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

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