通过索引获取字符串的特定部分?

时间:2011-02-06 02:35:38

标签: sql sql-server tsql

我有一个字符串:

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

那么我怎么能得到该字符串的特定部分,基于,比方说,索引。 所以

  • 如果index为0,请获取sigma_x1
  • 如果index为1,请获取sigma_x2
  • 如果index为2,请获取sigma_x3
  • 如果index是d-1,请获取sigma_xd
  • 如果索引是d,则获取XX,
  • 如果index为d + 1,则获取YY 等等。

以前 Andriy M 解决了类似问题,他的代码获取了一个基于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 个答案:

答案 0 :(得分: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 

你可以查询,如 假设您需要第4个索引

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

获取第4个索引的项目

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

将项目添加到变量

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