2016-12-08 17 views
1

ファイル名(成功している)を抽出しようとしていて、次に各ファイルパスの宛先を独自の列に抽出しようとしています。サブストリングを使用したファイルパスの抽出

例ファイルのパス:MPS://Global/Test/Health/Reports/file.html

予想される結果(4つの別々の列に):

File.html Reports Health Test Global 

私の実際の結果(2つの列のみ):

File.html mps://Global/Test/Health/Reports 

マイクエリ:

select 
RIGHT(filepath, CHARINDEX('/', REVERSE(filepath)) -1) AS ReportName 
LEFT(filepath,LEN(filepath) - charindex('/',reverse(filepath),1) + 1) AS ReportPath, 
from LOG; 

私は、それぞれの '/'の間の各パスをそれぞれの列でどのように抽出できるかを調べようとしています。私は4つの別々の列について多くのcharindexの変更を試しましたが、文字列の左右を取り除くことに問題があります。何か案は?

+0

これは動的である必要がありますか? '//global/test/health/somemore/somemore/somemore/somemore/file.html'のようにパスを長くすることはできますか? – SQLChao

+0

はい、私はちょうど4つのセクションを戻って行きたいので、私はちょうど短い例を置くことができますが、それは可能です。 – lnjblue

+0

わかりました。たとえそれが10と言うことになっても、4つのセクションだけが必要ですか? – SQLChao

答えて

1

XMLに変換してから、「ノード」をターゲットにしてください。

declare @yak varchar(100) = 'mps://Global/Test/Health/Reports/file.html'; 

declare @x xml = cast('<r><i>' + replace(replace(@yak, 'mps://', ''), '/', '</i><i>') + '</i></r>' as xml); 

select [Col1] = r.n.value('i[1]', 'varchar(100)'), 
     [Col2] = r.n.value('i[2]', 'varchar(100)'), 
     [Col3] = r.n.value('i[3]', 'varchar(100)'), 
     [Col4] = r.n.value('i[4]', 'varchar(100)'), 
     [Col5] = r.n.value('i[5]', 'varchar(100)'), 
     [Col6] = r.n.value('i[6]', 'varchar(100)') 
from @x.nodes('r')r(n); 

戻り値:

Col1 Col2 Col3 Col4 Col5  Col6 
---- ---- ---- ---- ----  ---- 
Global Test Health Reports file.html NULL 
0

私はあなたがstring_split機能を望むかもしれないと思います。 ISTRは特にファイル名を4つの部分(ドライブ、ディレクトリ、ベース、拡張子)に解析する機能ですが、Cのランタイムライブラリにあります。

0

特に、ファイルパスの一部がnullのまま残っている場合は、charindexの内部に大文字小文字を使用することができます。