それ以前のN番目のSQLテキスト?

SQLを使用して私は3番目のスラッシュの前にすべてのテキストを列に戻したい

そう

/one/two/three/whatever/testing

返すだろう:

/one/two/three

SQL(特にMS SQL 2005+のMS T-SQL)でこれを行うには、すばやく汚い方法はありますか?

7

3 答え

あなたが「迅速かつ汚れている」と言ったので、私は、この非常に迅速で非常に汚い解決策が下位の投票の束を受け取らないと仮定しています。以下のSQLは、複数の SUBSTRING()関数を使用して3番目のスラッシュを検索します。

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

ここの実例を見ることができます。

9
追加された
非常に素晴らしい..我々はこれもこの文字列で動作するようにすることができる何か/ 1/2/3%20rest /何でも/テスト..ありがとう。
追加された 著者 Hell.Bent,
@cyberpine、私はあなたが何を意味するか分からない。私の言う限りでは、あなたのコメントの文字列で正しく動作します: data.stackexchange.com/stackoverflow/query/60986/…
追加された 著者 James Hill,

関数を追加してみてください

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

より良い外観のためにここをご覧ください:)

7
追加された
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
0
追加された