日期:2014-05-18  浏览次数:20516 次

求一个比较复杂的SQL语句,其实也不复杂,只是我现在被搞晕了,希望大家给点提示
一个字段里面的内容是   ,1,2,3,4,6,7,5,12,16,22   这样的内容,我现在想去掉其中的一个或几个数字,比如
去掉4,就变成,1,2,3,6,7,5,12,16,22    
去掉4和7   就变成,1,2,3,6,5,12,16,22    
去掉12和16,就变成,1,2,3,4,6,7,5,22  

情况就是这样,我需要大家的帮助

我个人认为就是使用substring和charindex取值,但是我现在被搞晕了,总是取不出正确的来

字段内容也可能很短,比如只有   ,1   或者是空字符串

------解决方案--------------------
--去掉4
declare @str varchar(50)
set @str= ',1,2,3,4,6,7,5,12,16,22,44 '
select @str=replace(@str, ',4, ', ', ')
select @str

--result
--------------------------------------------------
,1,2,3,6,7,5,12,16,22,44

(1 row(s) affected)
------解决方案--------------------
通用是程序员的终极目标,写了如下的函数:
使用:
Select Dbo.DelIndexAry( '1,2,3,4,5,6 ', '4 ')
结果:
1,2,3,5,6
/*的到以@Split分割@AllStr所的到的数组的长度*/
CREATE function Get_StrAryLength
(
@AllStr varchar(1024), --要分割的字符串
@Split varchar(10) --分隔符号
)
Returns Int
AS
Begin
Declare @Location int
Declare @Start int
Declare @Length int

Set @AllStr = LTrim(RTrim(@AllStr))
Set @Location = CharIndex(@Split,@AllStr)
Set @Length = 1

While @Location <> 0
Begin
Set @Start = @Location + 1
Set @Location = CharIndex(@Split,@AllStr,@Start)
Set @length = @Length + 1
End
Return @Length
End

--------------------------
/*的到分割数组的对应下标所对的数组值*/
Create Function Get_StrAryStrOfIndex
(
@AllStr Varchar(1024), --要分割的字符串
@Split varchar(10), --分隔符号
@Index int --取第几个元素
)
Returns Varchar(1024)
as
begin
Declare @Location int
Declare @Start int
Declare @Next int
Declare @Seed int

Set @AllStr = LTrim(RTrim(@AllStr))
Set @Start = 1
Set @Next = 1
Set @Seed = Len(@Split)

Set @Location = CharIndex(@Split,@AllStr)
While @Location <> 0 And @Index > @Next
Begin
Set @Start = @Location + @Seed
Set @Location = CharIndex(@Split,@AllStr,@Start)
Set @Next = @Next+1
End
if @Location =0
Select @Location = Len(@AllStr)+1
--这儿存在两种情况:
--1、字符串不存在分隔符号
--2、字符串中存在分隔符号,跳出while循环后,@location为0,那默认为字符串后边有一个分隔符号。

Return SubString(@AllStr,@Start,@Location-@Start)
end
--------------------------
/*去除@AllStr中存在的@DelStr*/
Create Function DelIndexAry(@AllStr VarChar(100) , @DelStr VarChar(5))
Returns VarChar(100)
As
Begin
Declare @Next Int Set @Next = 1
Declare @Split VarChar(10) Set @Split = ', '
Declare @CurrIndex VarChar(10) Set @CurrIndex = ' '
Declare @ResultStr VarChar(100) Set @ResultStr = ' '

While @Next <= dbo.Get_StrArrayLength(@AllStr,@Split)
Begin
Set @CurrIndex = dbo.Get_StrArrayStrOfIndex(@AllStr,@Split,@Next)
If (@CurrIndex <> @DelStr)
Begin
If ( @Next = dbo.Get_StrArrayLength(@AllStr,@Split) )
Set @Split = ' '
Set @ResultStr = @ResultStr + @CurrIndex + @Split
End
Set @Next = @Next+1
End
Return @ResultStr
End