ワイルドカードを含む文字列をあいまい検索する
実装
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;