Как я могу получить почти последнюю подстроку из строки "/" в T-SQL? - PullRequest
2 голосов
/ 08 августа 2009

Если у меня есть строка, которая состоит из других строк, разделенных символом "/" (xxx ... xxx / xxx / xxxx), как я могу получить последнюю и почти последнюю (одну перед последней) часть с T-SQL? Вероятно, это должна быть комбинация charindex () и right ().

Ответы [ 3 ]

10 голосов
/ 08 августа 2009
declare @s varchar(50);
set @s = 'aaaaa/bbbbb/ccccc/ddddd/eeeee'

/* last one: */
select
    RIGHT(@s, CHARINDEX('/', REVERSE(@s)) - 1)

/* penultimate one */
select
    RIGHT(
      LEFT(@s, LEN(@s) - CHARINDEX('/', REVERSE(@s))), 
      CHARINDEX('/', REVERSE(
        LEFT(@s, LEN(@s) - CHARINDEX('/', REVERSE(@s)))
      )) - 1
    )

«Последний» довольно прост, объяснений не требуется.

«Предпоследний», по существу, равен «последнему», и все вхождения @s заменены на:

LEFT(@s, LEN(@s) - CHARINDEX('/', REVERSE(@s)))

, который производит 'aaaaa/bbbbb/ccccc/ddddd'

Чтобы проверить, достаточно ли косых черт в строке для успешного выполнения этого выражения, вы можете сделать

CASE WHEN LEN(@s) - LEN(REPLACE(@s, '/', '')) >= 2 
     THEN /* expression here */
     ELSE /* error value here */
END
1 голос
/ 04 февраля 2011

Parsename подходит только тогда, когда у вас есть 4 или менее частей с разделителями .... вот мое решение:

CREATE FUNCTION Piece(@string as varchar(1000),@delimiter as char(1),@piece as int)
RETURNS varchar(1000)
AS
BEGIN
    declare @Items table (Piece int,Item varchar(8000) NOT NULL)
    declare @return varchar(1000)
    DECLARE @Item As varchar(1000), @Pos As int
    DECLARE @piecenum AS int
    SET @piecenum=1
    WHILE DATALENGTH(@string)>0
        BEGIN
            SET @Pos = CHARINDEX(@delimiter,@string)
            IF @Pos = 0 SET @Pos = DATALENGTH(@string)+1
            SET @Item =  LTRIM(RTRIM(LEFT(@string,@Pos-1)))
            IF @Item<>'' INSERT INTO @Items SELECT @piecenum, @Item
            SET @piecenum=@piecenum+1
            SET @string=SUBSTRING(@string,@Pos+DATALENGTH(@delimiter),1000)
        END
    SELECT @return=Item FROM @Items WHERE Piece=@piece
    RETURN @return
END

так:

select dbo.Piece('a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q',',',10)

приводит к 'j'

1 голос
/ 08 августа 2009

Вы можете заменить '/' на '.' и используйте PARSENAME .

Вот SO ответ, используя его: Разделить строку в SQL

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