T-SQL найти строку и сообщить об индексе - PullRequest
0 голосов
/ 11 сентября 2011

Учитывая следующую строку с именем @ToSearch, как получить результат, совпадающий с индексом всех символов S в строке. Например:

set @ToSearch = 'SQLServer 2008 includes a variety of string and null functions' ;
set @Tofind = 's';

match 1       match 2   match 3       match 4
----------- ----------- ----------- -----------
1              4              23       38

Я пробовал это, но не работает, как я подозревал.

SET @ToSearchTemp = 
    SUBSTRING(@ToSearchTemp, CHARINDEX('s',@ToSearchTemp,1), LEN(@ToSearchTemp) );

Любые идеи, как решить эту проблему с помощью CTE или просто с помощью запроса.

Ответы [ 2 ]

1 голос
/ 11 сентября 2011

Если вы создаете таблицу вспомогательных чисел , сначала вы можете сделать

SELECT number 
FROM numbers
WHERE number <= LEN(@ToSearch) AND
SUBSTRING(@ToSearch,number,LEN(@Tofind)) = @Tofind

Это даст вам результат в формате строки. Если вам действительно нужен формат столбца, вам потребуется PIVOT, но для этого потребуется либо определить максимальное количество результатов, либо использовать динамический SQL.

0 голосов
/ 12 сентября 2011
ALTER PROCEDURE StringSearch 
--(
 @ToSearch VARCHAR(MAX)
,@Tofind   CHAR(1)
--)
AS 

DECLARE @Sentinel INT;
SET @Sentinel =0;
DECLARE @ToSearchTemp VARCHAR(MAX)
SET @ToSearchTemp = @ToSearch
DECLARE @Record int
SET @Record=0;
DECLARE @TestZero int

DECLARE @Matches Table(Match1 int,Id int)
While @Sentinel < LEN(@ToSearch)
    Begin
        INSERT INTO @Matches(Match1,Id)
        VALUES(charindex(@Tofind,@ToSearchTemp)+@Record,@Sentinel+1)
        set @ToSearchTemp = substring(@ToSearchTemp,charindex(@Tofind,@ToSearchTemp)+1,len(@ToSearchTemp))
        print @ToSearchTemp
        SET @TestZero=charindex(@Tofind,@ToSearchTemp)
        if @TestZero=0
        break;
        else
        set @Record =charindex(@Tofind,@ToSearchTemp)+@Record
        SET @Sentinel= @Sentinel +1
    End 

select [1] as Match1, [2] as Match2, [3] as Match3,[4] as Match4

FROM
(
 select top 4  Match1,ID from @Matches
)DataTable
 PIVOT
 (
    sum(Match1)
    For ID
    in ([1],[2],[3],[4])
 ) PivotTable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...