http://topic.csdn.net/u/20110720/20/22952284-1257-46d2-acf8-5896515f6661.html?seed=182651504&r=74520662#r_74520662
有这样一个表:
表名:T_ROLE_USER
两三字段:ID(主键自增),USERID(用户ID),FamousProduct(字符串)现在要完成这样一个功能,每次我会传入两个个参数@USERID,@FamousProduct。注意:
FamousProduct字段存储的数据结构为 AAA|BBB|CCC|DDD|EEE|这种格式。
很明显,这里用|分割了5组数据。我刚才传进来一组数据,要根据自增ID更新,以下是条件:
首先要判断参数@FamousProduct是不是包含在FamousProduct字段里。
如果包含,那就不操作。
如果不包含,并且FamousProduct字段里的数据少于5组那就去追加。
如果不包含,并且FamousProduct字段里的数据等于5组那就UPDATE。总之不等大于5组,最多是 AAA|BBB|CCC|DDD|EEE|这种格式。

解决方案 »

  1.   

    上个帖子已经说过,弄一些数据和想要的结果发上来。
    如何update,如何追加用数据来表示
      

  2.   


    FamousProduct字段存储的数据,4684awd,1|a65wd46,4d4wa5,2|654d,3|
    declare @USER_ID varchar(20) ='32'
    declare @FamousProduct(30) ='4a6w5d'然后按照下面所说的操作:
    首先要判断参数@FamousProduct是不是包含在FamousProduct字段里。
    如果包含,那就不操作。
    如果不包含,并且FamousProduct字段里的数据少于5组那就去追加。
    如果不包含,并且FamousProduct字段里的数据等于5组那就UPDATE掉最后一组(就是上面的654d,3)。
      

  3.   


    这个存在FamousProduct一个字段里“4684awd,1|a65wd46,4d4wa5,2|654d,3|”
    以“|”隔开为一组。
    重点想在想知道如何在这个字段上追加一组数据(如a4w6,3),并且追加的条件是原来是少于5组的,如果等于并且不包含在里面的话那就把第一组给替换掉,一直保持5组在里面就好。
      

  4.   


    declare @str varchar(100)
    declare @th varchar(10)
    set @th = 'a4w6,3'
    set @str = '4684awd,1|a65wd46,4d4wa5,2|654d,3|65232dd,3|6feewa,3|'select (case when charindex('|'+@th+'|','|'+@str)>0 then @str
    else case when count(*) < 5 then @str + @th + '|'
    else left(left(@str,len(@str)-1),len(left(@str,len(@str)-1))-charindex('|',reverse(left(@str,len(@str)-1)))+1)+@th+'|' end
    end)
    from master..spt_values
    where [type] = 'p' and number between 1 and len(@str)
    and substring(@str,number,1) = '|'
    /**************
    4684awd,1|a65wd46,4d4wa5,2|654d,3|65232dd,3|a4w6,3|(1 行受影响)
      

  5.   


    好吧,问分开问,FamousProduct一个字段里存“4684awd,1|a65wd46,4|d4wa5,2|654d,3|”几组数据,这里是四组,每一组用“|”分开。第一个问题,用上面函数判断当前是几组数据。
      

  6.   


    不是很明白为什么用select。
      

  7.   

    是否存在可利用like或charindex函数来判断,
    不存在的要,先取倒数第二位,“4684awd,1|a65wd46,4d4wa5,2|654d,3|”
    上面就是3,判断是否=5,是则替换,否就添加update tb 
    set FamousProduct=case when substring(FamousProduct,len(FamousProduct)-1,1)='5' 
                           then left(@FamousProduct,len(@FamousProduct)- 
                               charindex('|',stuff(reverse(@FamousProduct),1,1,'')))+@FamousProduct+'|'
                           else  FamousProduct+@FamousProduct+','
                                +ltrim(cast(substring(FamousProduct,len(FamousProduct)-1,1) as int)+1)
       endwhere USERID=@USERID
      

  8.   

    update tb 
    set FamousProduct=case when substring(FamousProduct,len(FamousProduct)-1,1)='5' 
                           then left(@FamousProduct,len(@FamousProduct)- 
                               charindex('|',stuff(reverse(@FamousProduct),1,1,'')))+@FamousProduct+'|'
                           else  FamousProduct+@FamousProduct+','
                                +ltrim(cast(substring(FamousProduct,len(FamousProduct)-1,1) as int)+1)
       endwhere USERID=@USERID --不存在的化就替换
    and   charindex(@FamousProduct,FamousProduct)=0
      

  9.   

    create table tb(FamousProduct varchar(50),USERID int)
    insert tb
    select 'AAA,1|BBB,2|CCC,3|DDD4|EEE,5|',1
    insert tb
    select 'AAA,1|BBB,2|CCC,3|',1declare @FamousProduct varchar(50),@USERID int
    set @FamousProduct='FFF'
    set @USERID=1update tb 
    set FamousProduct=case when substring(FamousProduct,len(FamousProduct)-1,1)='5' 
                           then left(FamousProduct,len(FamousProduct)- 
                               charindex('|',stuff(reverse(FamousProduct),1,1,'')))+@FamousProduct+',5|'
                           else  FamousProduct+@FamousProduct+','
                                +ltrim(cast(substring(FamousProduct,len(FamousProduct)-1,1) as int)+1)
                           endwhere USERID=@USERID        --不存在的化就替换
    and   charindex(@FamousProduct,FamousProduct)=0select * from tbdrop table tb/*
    FamousProduct                                      USERID      
    -------------------------------------------------- ----------- 
    AAA,1|BBB,2|CCC,3|DDD4|FFF,5|                      1
    AAA,1|BBB,2|CCC,3|FFF,4                            1(所影响的行数为 2 行)*/