5

1つのSQLServerデータベーステーブルの列にパスが含まれています(ファイルパスではなく、ディレクトリパスのみ)。

LIKE現在、関数を使用して、指定されたファイルパスのすべてのサブフォルダーを返すクエリがあります。

WHERE Path LIKE @FilePath + '%'

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

とにかく、私の質問に戻ります。指定されたパスの直接のサブフォルダーのみを返すようにクエリを変更できるようにしたいと思います。これは、文字列の最後にスラッシュを付けるほど簡単ではありません。これは、文字列の右側の部分を解析するときに、%ワイルドカードがすべてを飲み込むためです。

[^]エスケープシーケンスを使用して、\文字を除外して検索することを検討していましたが、うまくいきませんでした。私はこれを試しました。

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

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

4

2 に答える 2

3

LIKEなしでこれを行う方法は次のとおりです。

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

(ステートメントの最初の部分は、「@ FilePath +'%'のようなパス」と同じです)。

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

LIKEを使用する場合は、次のように記述できます。

where Path like @FilePath + '%' and
      Path not like @FilePath + '%[\]%'
于 2012-07-10T13:24:16.003 に答える
2

これには LIKE を使用しないでください。LEFT と SUBSTRING を使用すると、ワイルドカード検索を行わないため、パフォーマンスが向上します。ワイルドカード検索は、すべてのインスタンスで試して回避する必要があります。

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

私たちがやっていることは、より多くのサブディレクトリ ('\') を持つ可能性のあるすべての結果を破棄し、単一のサブディレクトリを持つ結果のみを使用することです。

お役に立てれば!

DECLARE @directory VARCHAR(150);
SET @directory = 'C:\Temp\';

SELECT 
    * 
FROM 
    tblDir
WHERE 
    LEFT(Dir, LEN(@directory)) = @directory
    AND CHARINDEX('\', SUBSTRING(Dir, LEN(@directory) ,LEN(Dir) - LEN(@directory)), 2) = 0
    AND Dir <> @directory
于 2012-07-10T13:46:50.813 に答える