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|这种格式。
有这样一个表:
表名: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|这种格式。
如何update,如何追加用数据来表示
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)。
这个存在FamousProduct一个字段里“4684awd,1|a65wd46,4d4wa5,2|654d,3|”
以“|”隔开为一组。
重点想在想知道如何在这个字段上追加一组数据(如a4w6,3),并且追加的条件是原来是少于5组的,如果等于并且不包含在里面的话那就把第一组给替换掉,一直保持5组在里面就好。
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 行受影响)
好吧,问分开问,FamousProduct一个字段里存“4684awd,1|a65wd46,4|d4wa5,2|654d,3|”几组数据,这里是四组,每一组用“|”分开。第一个问题,用上面函数判断当前是几组数据。
不是很明白为什么用select。
不存在的要,先取倒数第二位,“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
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
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 行)*/