получить определенную часть строки по индексу? - PullRequest
0 голосов
/ 06 февраля 2011

У меня есть строка вроде:

@ 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, получить YY и т. д.

Ранее Андрей М решил похожую проблему, его код получает подстроку, основанную на номбере, но возвращает подстроку следующим образом:

  • если @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 (ALL STRING)

Как обновить эту процедуру, чтобы получить определенный элемент?

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 Ответ

1 голос
/ 06 февраля 2011

просто попробуйте это.надеюсь, что это будет соответствовать вашим потребностям.

создайте функцию 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...