読者です 読者をやめる 読者になる 読者になる

1.21 jigowatts

Great Scott!

ワイルドカードを含む文字列をあいまい検索する

概要

あいまい検索したい項目のデータにワイルドカードが登録されててうまくいかない!ハヒハヒ!となってしまったので、ワイルドカード自体を含む文字列を検索するにはどうすればいいか調べてみました。

実装

SQLワイルドカードを文字として解釈して検索

そもそも、SQLワイルドカードを文字として解釈して検索させるには、ESCAPEキーワードを使用します(ほほう)。

--「5%」を含む文字列を取得
SELECT * FROM dbo.WORKS
WHERE ColumnA LIKE '%5/%%' ESCAPE '/'

参考:
検索条件のパターン照合

ADO.NETでクエリをビルド

次にADO.NETで実装してみます。
以下はあいまい検索のため、検索条件の前後に%(ワイルドカード)を付与しています。

private static void ContainsWhereBase(SqlCommand cmd, StringBuilder sb, string conditionValue, string colname)
{
    sb.AppendFormat("AND {0} Like @{0}  ESCAPE '/'", colname).AppendLine();
    cmd.Parameters.Add("@" + colname, SqlDbType.NVarChar);
    cmd.Parameters["@" + colname].Value = "%" + StringUtil.EscapeWildcard(conditionValue) + "%";        
}

正規表現で値をエスケープします。

public static string EscapeWildcard(string val)
{
    //ワイルドカード(_,%,[)をエスケープかつ、エスケープ文字(/)自体もエスケープ
    return Regex.Replace(val, "[_%\\[/]", "/$0");
}

まとめ

ESCAPEキーワードを付けてあげればOKですね!
試しにEntity FrameworkでContainsメソッドを使って検索してみたら、何も気にする必要なかった、Cooool !!

WorksEntities context = new WorksEntitiesEntities();
var query = from x in context.WORKS
            where x.ColumnA.Contains("5%")
            select x;