如何从T-SQL中的“/”分隔字符串中获取几乎最后一个子字符串?

时间:2009-08-08 10:22:00

标签: sql tsql

如果我有一个字符串,其中包含用“/”字符(xxx ... xxx / xxx / xxxx)分隔的其他字符串,我怎样才能获得最后一个和最后一个(最后一个)部分的字符串T-SQL?它应该是charindex()和right()的某种组合。

3 个答案:

答案 0 :(得分:10)

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 :(得分:1)

您可以将'/'替换为'。'并使用PARSENAME

以下是使用它的SO答案:Split String in SQL

答案 2 :(得分:1)

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'