Текст SQL перед N-м совпадением? - PullRequest
7 голосов
/ 06 февраля 2012

Используя SQL, я хотел бы вернуть весь текст до третьей косой черты в столбце

, поэтому

/one/two/three/whatever/testing

вернет:

/one/two/three

Любойбыстрый и грязный способ сделать это в SQL (в частности, MS T-SQL под MS SQL 2005+)?

Ответы [ 3 ]

10 голосов
/ 06 февраля 2012

Поскольку вы сказали «быстро и грязно», я предполагаю, что это очень быстрое и очень грязное решение не получит кучу отрицательных голосов.В приведенном ниже коде SQL используется несколько SUBSTRING() функций для поиска третьего слеша:

DECLARE @str VARCHAR(50)
SET @str = '/one/two/three/whatever/testing'
SELECT SUBSTRING(@str, 0, CHARINDEX('/', @str, CHARINDEX('/', @str, CHARINDEX('/', @str, CHARINDEX('/', @str, 0) + 1) + 1) + 1))

Вы можете увидеть рабочий пример здесь .

7 голосов
/ 06 февраля 2012

Попробуйте добавить функцию

/*
Example:
SELECT dbo.CHARINDEX2('a', 'abbabba', 3)
returns the location of the third occurrence of 'a'
which is 7
*/

CREATE FUNCTION CHARINDEX2
(
    @TargetStr varchar(8000), 
    @SearchedStr varchar(8000), 
    @Occurrence int
)

RETURNS int
AS
BEGIN

    DECLARE @pos INT, @counter INT, @ret INT

    set @pos = CHARINDEX(@TargetStr, @SearchedStr)
    set @counter = 1

    if @Occurrence = 1 set @ret = @pos
    else
    begin

        while (@counter < @Occurrence)
        begin

            select @ret = CHARINDEX(@TargetStr, @SearchedStr, @pos + 1)

            set @counter = @counter + 1

            set @pos = @ret

        end

    end

    RETURN(@ret)

end

Тогда ссылаться на функцию как таковую ...

SELECT SUBSTRING('/one/two/three/whatever/testing', 0, dbo.CHARINDEX2('/', '/one/two/three/whatever/testing', 3))

Ознакомьтесь со статьей здесь для лучшего вида:)

0 голосов
/ 10 августа 2016
CREATE FUNCTION dbo.CharIndex2 (@expressionToFind VARCHAR(MAX), @expressionToSearch VARCHAR(MAX), @instance INT)
    RETURNS INT
BEGIN
    DECLARE @Position INT

    DECLARE @i INT = 1
    WHILE @i <= @instance
    BEGIN
        SET @Position = CHARINDEX(@expressionToFind,@expressionToSearch,COALESCE(@Position+1,1))
        SET @i += 1
    END

    RETURN @Position
END
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...