一个表中某个字段的内容如下,存在多个并列的ID, 且分隔符有两种,前两天问过一个是单一分隔符的问题,大家帮助解答了,我是用的下面贴的那个方法,但是这种两个或多个分隔符的我就不知道怎么弄了。还得请大家帮助解答,因为我现在的程序还达不到举一反三的水平呀。
11,22,33|12,23 
11 
11|22 
2,3 
这些ID的属性表为: 
ID 
11 月 
22 年 
33 家 
12 六 
23 五 
我希望得到的效果是:(将ID转换为对应的值) 
月,年,家,六,五 
月 
月,年 
-----------
tba
ID  classid   name
1     1,2,3   西服 
2     2,3    中山装
3     1,3    名裤
tbb 
id   classname
1     衣服
2     上衣
3     裤子我得的结果是
id   classname            name
1     衣服,上衣,裤子      西服 
2          上衣,裤子     中山装
3     衣服,裤子          名裤create table tba(ID int,classid varchar(20),name varchar(10))
insert into tba values(1,'1,2,3','西服')
insert into tba values(2,'2,3'  ,'中山装')
insert into tba values(3,'1,3'  ,'名裤')
create table tbb(ID varchar(10), classname varchar(10))
insert into tbb values('1','衣服')
insert into tbb values('2','上衣')
insert into tbb values('3','裤子')
go--第1种方法,创建函数来显示
create function f_hb(@id varchar(10))
returns varchar(1000)
as
begin
  declare @str varchar(1000)
  set @str=''
  select @str=@str+','+[classname] from tbb where charindex(','+cast(id as varchar)+',',','+@id+',')>0
  return stuff(@str,1,1,'')
end
go 
select id,classid=dbo.f_hb(classid),name from tba
drop function f_hb
/*
id          classid       name       
----------- ------------- ---------- 
1           衣服,上衣,裤子 西服
2           上衣,裤子      中山装
3           衣服,裤子      名裤
(所影响的行数为 3 行)
*/

解决方案 »

  1.   

    charindex(','+cast(id as varchar)+',',','+@id+',')> 0 or charindex('|'+cast(id as varchar)+'|'|','+@id+'|')> 0这不就两个了?
      

  2.   


    create  table os(val varchar(50))
    insert into os select '11,22,33|12,23'  
    insert into os select '11'  
    insert into os select '11|22'  
    insert into os select '2,3'create  table p(id int,name varchar(10))
    insert into p select 11,'月'
    insert into p select 22,'年'
    insert into p select 33,'家'
    insert into p select 12,'六'
    insert into p select 23,'五'alter function f_hb(@val varchar(50)) 
    returns varchar(1000) 
    as 
    begin 
      declare @str varchar(1000) 
      select @str=isnull(@str+',','')+name from p where charindex(','+ltrim(id)+',',','+@val+',')> 0 
      or charindex('|'+ltrim(id)+'|','|'+@val+'|')> 0 
      or charindex(','+ltrim(id)+'|',','+@val+'|')> 0 
      or charindex('|'+ltrim(id)+',','|'+@val+',')> 0 
      return @str
    end select dbo.f_hb(val) from os
      

  3.   

    多谢楼上两位,OK了,学到不少东西,我虽然也加了好几个OR,但是可能是一排列不对。所以总是有出来的情况。谢谢!