LIKE で検索するときの文字のエスケープ (SQL Server)

LIKE 演算子を使用して部分一致検索などを行う場合、パーセント記号 (%) およびアンダースコア (_) をワイルドカードとして利用できますが、
例えば "10%" や "(^_^)/" をキーワードとして検索するときなど、
検索キーワード自体にワイルドカードが含まれているときにはこれらをリテラルとして扱うためにエスケープしなければなりません。

Transact-SQL では、検索キーワードのエスケープは次の方針に従います。

  • = 演算子または <> 演算子を使用する場合、いずれの文字もエスケープしない。
  • LIKE 演算子を使用する場合、パーセント記号 (%)、アンダースコア (_) および左角かっこ ([) を 2 つの角かっこ ([ ]) で囲む。

つまり、LIKE 演算子を使用する場合に限り、次の置換が必要ということです。

  • % → [%]
  • _ → [_]
  • [ → [[]

単純に String.Replace メソッドを利用すれば、次のように記述できます。

string newText = text.Replace("[", "[[]").Replace("%", "[%]").Replace("_", "[_]");

正規表現を利用すれば、次のように記述できます。

string newText = Regex.Replace(text, @"[%_\[]", "[$0]");

第 3 引数の中の $0 は、第 2 引数のパターンに一致したものの全体を表します。
これは、Regex.Matches メソッドにより返される各 Match オブジェクトの Groups[0] に相当するものです。

具体例を以下に示します。


// 商品名に対する部分一致検索をします。
public static void FillProductByLikeName(AdventureWorksDataSet.ProductDataTable dataTable, string name)
{
    if (name == null)
    {
        throw new ArgumentNullException("name");
    }
 
    using (var ta = new ProductTableAdapter())
    {
        // ProductTableAdapter.FillByLikeName メソッドは次の SQL から自動生成したメソッドです。
        // SELECT * FROM Product WHERE Name LIKE @Name
        ta.FillByLikeName(dataTable, AppendWildcard(EscapeForLike(name)));
    }
}
 
private static string AppendWildcard(string text)
{
    return string.Format("%{0}%", text);
}
 
private static string EscapeForLike(string text)
{
    return Regex.Replace(text, @"[%_\[]", "[$0]");
}

バージョン情報
.NET Framework 2.0, 3.0, 3.5, 4
SQL Server 2005, 2008, 2008 R2

参照
LIKE (Transact-SQL)
置換
Regex.Replace メソッド

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。