2011-10-28 22 views
4

これを行う良い方法が見つからず、いくつかの制約のために変数を使用せずにコード化する必要がありますが、関数を呼び出すことができます。とにかく、Selectクエリから結果セットを返す必要があり、行の1つがパイプで区切られた文字列です。SQL解析の区切り文字列

だから、それはのようなものを返します:

id| Name  | Message | 
--------------------- 
1 | Some Name | 'Here is my | delimited | message' 

を、私はそれが私があなたの代わりにそれを区切りに渡すことができますParsename('','|',1)、のようなものを考えていた

id| Name  | Message1  | Message2 | Message3 
------------------------------------------------------ 
1 | Some Name | 'Here is my' | 'delimited' | 'message' 

する必要があります常に期間ですが、私はそれを達成するための最善の方法を知らない。

編集:私はこのバリエーションを試しましたが、もちろん非常に混乱しています。 | 4つ以上の可能性があります|

SELECT Field1, 
Field2 AS Originalvalue, 
--1 
SUBSTRING(Field2,0,CHARINDEX('|',Field2)) AS Msg1, 
--2 
LEFT(SUBSTRING(Field2,CHARINDEX('|',Field2)+1 ,LEN(Field2)),CHARINDEX('|',SUBSTRING(Field2,CHARINDEX('|',Field2)+1 ,LEN(Field2)))-1) 
AS ExtractedValue 
FROM Table1 T1 JOIN Table2 T2 
ON T1.Id = T2.Id 
WHERE T1.Id = 12 
+3

なぜ人々は、[これをやり続ける]ん(http://stackoverflow.com/search?q=sql+delimited)?! – Phil

+4

パイプで区切られたフィールドでSQLの妖精が死ぬ – scrappedcola

+0

ええと、このサイトの質問に回答できない人はいますか?それは 'googleを見てください'の多くのようです。私は今1時間以上探していて、私が探しているものを正確に見つけられませんでした。 – user204588

答えて

8

次のようにSQL関数を記述できます。

create Function dbo.fn_Parsename(@Message Varchar(1000), @delimiter char(1), @index int) 
Returns Varchar(1000) 
As 
Begin 
    Declare 
     @curIndex int = 0, 
     @pos int = 1, 
     @prevPos int = 0, 
     @result varchar(1000) 

    while @pos > 0 
    Begin 

     set @pos = CHARINDEX(@delimiter, @Message, @prevPos); 

     if(@pos > 0) 
     begin-- get the chars between the prev position to next delimiter pos 
      set @result = SUBSTRING(@message, @prevPos, @[email protected]) 
     end 
     else 
     begin--get last delim message 
      set @result = SUBSTRING(@message, @prevPos, LEN(@message)) 
     end 

     if(@index = @curIndex) 
     begin 
      return @result 
     end 

     set @prevPos = @pos + 1 
     set @curIndex = @curIndex + 1; 

    end 
    return ''--not found 
End 

そして、あなたは以下のようにそれを呼び出すことができます。

select dbo.fn_Parsename('Here is my | delimited | message','|', 0) 
select dbo.fn_Parsename('Here is my | delimited | message','|', 1) 
select dbo.fn_Parsename('Here is my | delimited | message','|', 2) 
+1

と一緒に働かなければならないものです!どうもありがとう。ほんとうにありがとう。 – user204588

関連する問題