2011-02-06 105 views
0

我有一個字符串,如:通過索引獲取字符串的特定部分?

@TempCol = sigma_x1,sigma_x2,...,sigma_xd,XX,YY,ZZ

所以,我怎麼能得到這個字符串,基於的特定部分,讓說一個指數。 所以

  • 如果索引爲0,得到sigma_x1
  • 如果索引是1,得到sigma_x2
  • 如果索引是2,得到sigma_x3
  • 如果索引d-1,得到sigma_xd
  • 如果索引是d,則獲得XX,如果索引是d + 1,則獲得XX,
  • ,獲得YY 等等。

以前舍甫琴科中號解決了類似的問題,他的代碼獲取根據nomber一子,但返回一個子方式如下:

  • 如果@d是1,得到sigma_x1
  • 如果@d是2,得到sigma_x1,sigma_x2
  • 如果@d是3,得到sigma_x1,sigma_x2,sigma_x3
  • 如果@d是4,得到sigma_x1,sigma_x2,sigma_x3,sigma_x4
  • 如果@d是d,得到sigma_x1,sigma_x2,sigma_x3,sigma_x4,...,sigma_xd(所有的串)

如何更新此過程,以獲得特定元素?

DECLARE @TempCol varchar(max), @d int, @p int, @Result varchar(max); 
SET @TempCol = 'item1,item2,itemA,itemB,item#,item$'; 
SET @d = 3; 

SET @p = 1; 
WHILE @d > 0 AND @p > 0 BEGIN 
    SET @p = CHARINDEX(',', @TempCol, @p); 
    IF @p > 0 SET @p = @p + 1; 
    SET @d = @d - 1; 
END; 

IF @p = 0 
    SET @Result = @TempCol 
ELSE 
    SET @Result = SUBSTRING(@TempCol, 1, @p - 2); 

SELECT @Result; 

回答

1

只是試試這個。希望這會滿足您的需求。

創建一個函數GetIndex,它接受字符串分隔符來分割字符串

CREATE FUNCTION dbo.GetIndex(@String varchar(8000), @Delimiter char(1))  
returns @temptable TABLE (itemindex int identity(1,1), items varchar(8000))  
as  
begin  
    declare @idx int  
    declare @slice varchar(8000)  

    select @idx = 1  
     if len(@String)<1 or @String is null return  

    while @idx!= 0  
    begin  
     set @idx = charindex(@Delimiter,@String)  
     if @idx!=0  
      set @slice = left(@String,@idx - 1)  
     else  
      set @slice = @String  

     if(len(@slice)>0) 
      insert into @temptable(Items) values(@slice)  

     set @String = right(@String,len(@String) - @idx)  
     if len(@String) = 0 break  
    end 
return  
end 

,你可以查詢一樣,
假設你需要第四屆指數則

select * from dbo.GetIndex(@TempCol,',') where itemindex = 4 

獲得一個項目第四指數然後

select items from dbo.GetIndex(@TempCol,',') where itemindex = 4 

將項目變爲變量

select @Aux = items from dbo.GetIndex(@TempCol,',') where itemindex = 4 
+0

一個問題,我如何在存儲過程中調用你的函數,我使用類似的語法嗎? – cMinor 2011-02-06 04:33:36