2012-09-12 54 views
2

我有以下字符串:從3逗號選擇字符串

bzip2,1,668,sometext,foo,bar 

我怎麼能只選擇sometext,foo,bar?第三個逗號前面的字符串的長度可能有所不同,並且在sometext,foo,bar之內可能有逗號。

我想盡可能簡潔的代碼,即最好是1行代碼,沒有循環。但隨時發佈任何你想到的解決方案。

+2

@a_horse_with_no_name這與問題絕對*零*。 –

+0

也許這可能會給你一個開始:http://stackoverflow.com/questions/8726111/sql-server-find-nth-occurrence-in-a-string – Bridge

+0

總是會有3個逗號(4個「元素」) ? – Bridge

回答

0

我只是想出了一些作品:

declare @v varchar(max) = 'bzip2,1,668,sometext' 
select substring(@v, CHARINDEX(',', @v, CHARINDEX(',', @v, CHARINDEX(',', @v)+1)+1)+1, len(@v)) 
+5

我會建議你接受@Joe的回答,因爲這與他在3分鐘前提供的完全相同的解決方案。 –

+0

@Mike是的,在@Joe發佈他的答案之前,我想到了一點。他雖然略有不同,但它有更多的'1'和'@ v' –

+1

作爲一個經驗法則,OP不應在發佈後幾分鐘內回答他自己的問題。 –

6

試試這個:

不要從3逗號的子字符串的結尾。要查找的3個逗號,我使用CHARINDEX()函數的3倍

declare @str varchar(50)='bzip2,1,668,some,text' 

    select substring(@str, 
    CHARINDEX(',',@str,CHARINDEX(',',@str,CHARINDEX(',',@str,1)+1)+1)+1, 
    LEN(@str)-CHARINDEX(',',@str,CHARINDEX(',',@str,CHARINDEX(',',@str,1)+1)+1)) 

結果

some,text 
+0

只是在這裏發表評論,因爲我看到這仍然得到更多upvotes ...它使用'CHARINDEX'的數量的兩倍作爲我的答案。更好的解決方案是:聲明@v varchar(max)='bzip2,1,668,sometext' select substring(@v,CHARINDEX(',',@v,CHARINDEX(',',@v,CHARINDEX(', ',@v)+1)+1)+1,len(@v))'(正如我發佈的答案)。 –

1

這裏是另一個想法

DECLARE @xml AS XML,@str AS VARCHAR(50) 
    SET @str='bzip2,1,668,sometext,foo,bar' 

    SET @xml = CAST(('<X>'+REPLACE(@str,',' ,'</X><X>')+'</X>') AS XML) 


     SELECT FinalResult = STUFF(@str,1,SUM(Length)+3,' ') FROM (SELECT 
           Rn = ROW_NUMBER() OVER(ORDER BY (SELECT 1)) 
           ,N.value('.', 'varchar(10)') as value 
           ,Length = LEN(N.value('.', 'varchar(10)')) 
          FROM @xml.nodes('X') as T(N))X 
     WHERE X.Rn<=3 

結果

sometext,foo,bar 
+1

在這裏不保證順序,所以你可能會得到字符串的拆分元素按照不同的順序,當後東西包含逗號。 –

+0

我以順序方式生成它(行號)。訂單如何改變? –

+1

它可能不是,但那不是重點,它不能保證!它如何順序?你的內在訂單故意使訂單爲任意,並且外部查詢根本不使用訂單! –

2

代碼:

declare @input varchar(max) = 'bzip2,1,668,s,o,m,e,t,e,x,t,f,o,o,b,a,r' 
--declare @input varchar(max) = 'bzip2,,' 
declare @thirdCommaPosition int = nullif(charindex(',', @input, nullif(charindex(',', @input, nullif(charindex(',', @input, 1),0)+1),0)+1),0) 
select stuff(@input, 1, @thirdCommaPosition, '') 

輸出:

s,o,m,e,t,e,x,t,f,o,o,b,a,r 

編輯

新增NULLIF的第三逗號計算部分,沒有他們,這是可能得到不一致的結果。