2009-08-08 33 views

回答

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 
+0

+1。這是一個很好的答案;我仍然喜歡PARSENAME! ;) – 2009-08-08 12:34:13

1

你可以用替換「/」「」並使用PARSENAME

下面是使用它SO回答:Split String in SQL

+0

我甚至不知道'PARSENAME()'。雖然它似乎只能處理四個單獨的部分。 – Tomalak 2009-08-08 13:41:08

+0

嘿,但如果字符串中有任何其他點(「。」),它將無法正常工作。在這種情況下有。 -1 – agnieszka 2009-08-09 21:11:24

+0

@agnieszka:真實的,但我以爲這是顯而易見的。 – 2009-08-10 03:23:50

1

當你有4條或更少分隔件PARSENAME是唯一的好.. ..here是我的解決方案:

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 @[email protected]+1 
      SET @string=SUBSTRING(@string,@Pos+DATALENGTH(@delimiter),1000) 
     END 
    SELECT @return=Item FROM @Items WHERE [email protected] 
    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'

相關問題