2012-02-06 23 views
7

Uso de SQL que me gustaría volver todo el texto antes de la tercera barra diagonal en una columnaTexto SQL antes de la enésima coincidencia?

por lo

/one/two/three/whatever/testing 

volvería:

/one/two/three 

Cualquier manera rápida y sucia para hacer esto en SQL (específicamente MS T-SQL bajo MS SQL 2005+)?

Respuesta

9

ya que dijo " rápido y sucio ", supongo que esta solución muy rápida y sucia no recibirá un montón de votos a la baja. El SQL a continuación utiliza múltiples funciones SUBSTRING() para encontrar la tercera barra:

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

se puede ver un ejemplo de trabajo here.

+0

muy bueno ... cualquier cosa que podamos hacer para que funcione con esta cadena también '/ one/two/three% 20rest/whatever/testing .. gracias. – o365spo

+0

@cyberpine, no estoy seguro de a qué te refieres. Por lo que puedo decir, funciona correctamente con la cadena en su comentario: http://data.stackexchange.com/stackoverflow/query/60986/find-3rd-instance-of –

7

Trate de añadir la función

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

después hacer referencia a la función como tal ...

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

Salida here un artículo para ver mejor :)

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 
Cuestiones relacionadas