簡體   English   中英

從字符串中的第三個逗號中選擇

[英]SELECT from 3rd comma in string

我有以下字符串:

bzip2,1,668,sometext,foo,bar

我怎樣才能只選擇sometext,foo,bar 第三個逗號之前的字符串長度可能不同,並且sometext,foo,bar可能有逗號。

我想盡可能簡潔的代碼,即最好是1行代碼,沒有循環。 但隨意發布您認為的任何解決方案。

嘗試這個:

從第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

碼:

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添加到第三個逗號計算部分,沒有它們就可能得到不一致的結果。

這是另一個想法

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 @v varchar(max) = 'bzip2,1,668,sometext'
select substring(@v, CHARINDEX(',', @v, CHARINDEX(',', @v, CHARINDEX(',', @v)+1)+1)+1, len(@v))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM