2012-07-10 9 views
5

1つのSQL Serverデータベーステーブルの1つの列に、パス(ファイルパスではなくディレクトリパスのみ)が含まれます。SQL Serverの "LIKE"機能を使用したファイルパスのテーブルからのファイルパスのサブフォルダの検索

私は現在、LIKE関数を使用して、指定されたファイルパスのすべてのサブフォルダを返すクエリを持っています。

WHERE Path LIKE @FilePath + '%' 

LIKEで使用されるエスケープ文字はすべて有効なファイルパス文字であるため、このアプローチには問題があることを認識しています。完成したクエリでESCAPEを適切に使用するつもりです。

とにかく、私の質問に戻る。クエリを変更して、の指定されたパスのサブフォルダのみを返すようにしたいと考えています。これは文字列の最後にスラッシュを付けるのと同じくらい簡単なことではありません。明らかに、ワイルドカードの%は、文字列の右側の部分を解析するときにすべてをゴブリングします。

私は[^]エスケープシーケンスを使用して、おそらく\文字を除外する検索を行っていましたが、私はそれに幸運を持っていませんでした。私はこれを試みた。

WHERE Path LIKE @FilePath + '[^\]' 

しかし、意図した結果が得られないため、正しく使用しているかどうかはわかりません。ここで

答えて

2

。ワイルドカード検索を行わないので、LEFTとSUBSTRINGの方がパフォーマンスが向上します。すべてのインスタンスで試して回避する必要があります。

以下のクエリはこれを行い、完全一致を除外します。したがって、ディレクトリ 'C:\ Temp \がある場合、結果には表示されませんが、すべてのサブディレクトリが表示されます。

私たちがやっていることは、サブディレクトリ( '\')がさらにあり、サブディレクトリが1つしかない結果をすべて投げ捨てていることです。

希望すると便利です。

+0

カラムに関数を適用すると、効果的にクエリを非[sargable](http://en.wikipedia.org/wiki/Sargable)にしています。一方、固定文字列(マスク文字や '%'、 '_'や' [...] 'などの式とは対照的に)で始まるパターンに対する' LIKE'は、利用される。 –

+0

私の場合、Andriyの列はNVARCHAR(MAX)なので、それはとにかく索引付けされません。しかし、良い点。 @Charl Lamprecht - あなたの答えをありがとう、LEFTの使用は私にLIKEオペレータのエスケープ文字を扱わなければならないという手間を省く - 歓声! –

3

はLIKEなしでこれを行う方法です:

WHERE left(Path, len(@FilePath)) = @FilePath and 
     charindex('\', substr(Path, len(@FilePath)+2, 1000)) = 0 

(文の最初の部分は "@filepath + '%' のような道" と同じです)。

2番目の部分は文字列を調べ、@FilePathの後にバックスラッシュがないことを確認します(おそらく次の文字はバックスラッシュです)。

あなたはLIKE好む場合は、これを書くことができます。このためにLIKEを使用しないでください

​​
関連する問題