私は次の文字列を持っています:
bzip2,1,668,sometext,foo,bar
どうすればSELECTのみできsometext,foo,bar
ますか?3番目のコンマの前の文字列の長さは異なる場合があり、。内にコンマが含まれる場合がありますsometext,foo,bar
。
できるだけ簡潔なコード、つまり、ループのない1行のコードが望ましいです。しかし、あなたが考えている解決策を自由に投稿してください。
私は次の文字列を持っています:
bzip2,1,668,sometext,foo,bar
どうすればSELECTのみできsometext,foo,bar
ますか?3番目のコンマの前の文字列の長さは異なる場合があり、。内にコンマが含まれる場合があります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
編集
3 番目のカンマ計算部分に nullif を追加しました。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))