我有以下字符串:從3逗號選擇字符串
bzip2,1,668,sometext,foo,bar
我怎麼能只選擇sometext,foo,bar
?第三個逗號前面的字符串的長度可能有所不同,並且在sometext,foo,bar
之內可能有逗號。
我想盡可能簡潔的代碼,即最好是1行代碼,沒有循環。但隨時發佈任何你想到的解決方案。
我有以下字符串:從3逗號選擇字符串
bzip2,1,668,sometext,foo,bar
我怎麼能只選擇sometext,foo,bar
?第三個逗號前面的字符串的長度可能有所不同,並且在sometext,foo,bar
之內可能有逗號。
我想盡可能簡潔的代碼,即最好是1行代碼,沒有循環。但隨時發佈任何你想到的解決方案。
我只是想出了一些作品:
declare @v varchar(max) = 'bzip2,1,668,sometext'
select substring(@v, CHARINDEX(',', @v, CHARINDEX(',', @v, CHARINDEX(',', @v)+1)+1)+1, len(@v))
我會建議你接受@Joe的回答,因爲這與他在3分鐘前提供的完全相同的解決方案。 –
@Mike是的,在@Joe發佈他的答案之前,我想到了一點。他雖然略有不同,但它有更多的'1'和'@ v' –
作爲一個經驗法則,OP不應在發佈後幾分鐘內回答他自己的問題。 –
試試這個:
不要從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
只是在這裏發表評論,因爲我看到這仍然得到更多upvotes ...它使用'CHARINDEX'的數量的兩倍作爲我的答案。更好的解決方案是:聲明@v varchar(max)='bzip2,1,668,sometext' select substring(@v,CHARINDEX(',',@v,CHARINDEX(',',@v,CHARINDEX(', ',@v)+1)+1)+1,len(@v))'(正如我發佈的答案)。 –
這裏是另一個想法
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
在這裏不保證順序,所以你可能會得到字符串的拆分元素按照不同的順序,當後東西包含逗號。 –
我以順序方式生成它(行號)。訂單如何改變? –
它可能不是,但那不是重點,它不能保證!它如何順序?你的內在訂單故意使訂單爲任意,並且外部查詢根本不使用訂單! –
代碼:
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的第三逗號計算部分,沒有他們,這是可能得到不一致的結果。
@a_horse_with_no_name這與問題絕對*零*。 –
也許這可能會給你一個開始:http://stackoverflow.com/questions/8726111/sql-server-find-nth-occurrence-in-a-string – Bridge
總是會有3個逗號(4個「元素」) ? – Bridge