小阴口是连在一起的吗:问一个sql解决解析的问题[希望是通过纯sql语句解决]

来源:百度文库 编辑:神马品牌网 时间:2024/04/25 17:15:44
有2个表
表A
------------------------
字段名/AUTH/AUTHNAME
/ 12 /前锋
/ 7 /守门
/ 244/教练
------------------------
表B
------------------------
字段名/AUTHG/AUTHGNAME
/ 1 /12,7
/ 2 /244
/ 3 /12,7,244
------------------------
希望得到的查询结果
1/前锋,守门
2/教练
3/前锋,守门,教练
等于是把数字解析成文字,谢谢

先建立一个和表B一样结构的表C,然后用游标实现

declare @source varchar(20)
declare @desc varchar(20)
declare @lstr varchar(20)
declare @rstr varchar(20)
declare @memo varchar(20)
declare @id int
declare @k int
declare cs1 cursor for
select AUTHG,AUTHGNAME from 表B
truncate table 表C
open cs1
fetch next from cs1 into @id,@source
while @@FETCH_STATUS = 0
begin
set @source=@source+','
set @desc=''
set @rstr=@source
set @k=charindex(',',@rstr)
while @k>0
begin
set @lstr=substring(@rstr,1,charindex(',',@rstr)-1)
set @rstr=substring(@rstr,charindex(',',@rstr)+1,len(@rstr)-charindex(',',@rstr))
select @memo=AUTHNAME from 表A where AUTH=@lstr
set @desc=@desc+@memo+','
set @k=charindex(',',@rstr)
end
insert into 表C values(@id,left(@desc,len(@desc)-1))
fetch next from cs1 into @id,@source
end
close cs1
deallocate cs1
select * from 表C

蛮复杂的一个过程
用SQL语句效率很低
这个函数给你参考
dbo.split(字段名,'分隔字符',取出的第几个字符串)
---------------------
CREATE FUNCTION [dbo].[split]
(@str nvarchar(4000),@code varchar(10),@no int )
RETURNS varchar(200)
AS
BEGIN

declare @intLen int
declare @count int
declare @indexb int
declare @indexe int
set @intLen=len(@code)
set @count=0
set @indexb=1

if @no=0
if charindex(@code,@str,@indexb)<>0
return left(@str,charindex(@code,@str,@indexb)-1)
else
return @str

while charindex(@code,@str,@indexb)<>0
begin
set @count=@count+1
if @count=@no
break
set @indexb=@intLen+charindex(@code,@str,@indexb)
end

if @count=@no
begin

set @indexe=@intLen+charindex(@code,@str,@indexb)
if charindex(@code,@str,@indexe)<>0
return substring(@str,charindex(@code,@str,@indexb)+len(@code),charindex(@code,@str,@indexe)-charindex(@code,@str,@indexb)-len(@code))
else
return right(@str,len(@str)-charindex(@code,@str,@indexb)-len(@code)+1)

end

return ''

END