2012-02-06 11 views
7

Korzystanie z SQL Chciałbym wrócić cały tekst przed 3rd ukośnika w kolumnieTekst SQL przed N-tą meczem?

tak

/one/two/three/whatever/testing 

wróci:

/one/two/three 

Wszelkie szybki i brudny sposób to zrobić w SQL (w szczególności MS T-SQL w MS SQL 2005+)?

Odpowiedz

9

Ponieważ powiedziałeś " szybkie i brudne ", zakładam, że to bardzo szybkie i bardzo brudne rozwiązanie nie otrzyma wielu głosów w dół. Poniższa SQL używa wielu SUBSTRING() funkcji znaleźć trzeci ukośnik:

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)) 

można zobaczyć przykład roboczy here.

+0

bardzo ładne .. wszystko, co możemy zrobić, to działa z tym ciągiem zbyt "/ jeden/dwa/trzy% 20rest/cokolwiek/testowanie .. dziękuję. – o365spo

+0

@cyberpine, nie jestem pewien co masz na myśli. O ile mogę powiedzieć, działa poprawnie z ciągiem w twoim komentarzu: http://data.stackexchange.com/stackoverflow/query/60986/find-3rd-instance-of –

7

spróbuj dodać funkcję

/* 
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 

następnie odwołać funkcję jako takiego ...

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

Wyjazd artykuł here dla lepszego wyglądu :)

0
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