「%」(パーセント)は文字としてDB検索可能なのでしょうか?

884 views
Skip to first unread message

中村 千尋

unread,
Sep 9, 2011, 7:14:02 AM9/9/11
to 日本Androidの会
いつもお世話になっております。
中村です。

ユーザ入力文字列をDB内でパターンマッチ検索し、結果をリスト表示する処理を検討しております。
ユーザ入力が「%」だった場合の処理を検討しているのですが、
「%」はSQlite3 DBでワイルドカードと認識されるため、文字としての「%」検索ができません。
プレースホルダを使用してみましたが同じ結果になってしまいました。

そこで質問させていただきたいのですが、
 ①「%」をDB内で検索することは可能でしょうか?
 ②上記①がYESの場合、「%」をDB内で検索する方法をご教授頂けますでしょうか?

どなたかご存知の方がおられましたら、ご教授頂けます様お願い致します。

以上、よろしくお願い致します。

元木

unread,
Sep 9, 2011, 7:23:35 AM9/9/11
to android-g...@googlegroups.com
こんばんは、元木です。
 
・SQLite
・エスケープ
などのキーワードで検索すれば、いろいろと情報は拾えます。
 
私が簡単にググッて見たところ、下記サイトが参考になりそうかな?と思いました。
 

 
2011年9月9日20:14 中村 千尋 <wow.nkm...@bee-u.com>:

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。


中村 千尋

unread,
Sep 12, 2011, 2:04:52 AM9/12/11
to 日本Androidの会
To:元木様

いつもお世話になっております。
中村です。

参考サイトの情報をありがとうございます。
自分なりに情報収集しており、ご教示頂いたサイトも見ていたのですが

「SQLite に限って言えば、like 演算子 + プレースホルダー、
 または like 演算子 + escape 演算子は鬼門ということになる。」

と説明があり、like演算子を使用するつもりだったため
途中で読むのを中断しておりました。


ご教示頂いたサイトの方法を下に実装してみます。
以上、よろしくお願い致します。



On 9月9日, 午後8:23, 元木 <kiyoshi.mot...@gmail.com> wrote:
> こんばんは、元木です。
>
> ・SQLite
> ・エスケープ
> などのキーワードで検索すれば、いろいろと情報は拾えます。
>
> 私が簡単にググッて見たところ、下記サイトが参考になりそうかな?と思いました。
>
> http://rubyist.g.hatena.ne.jp/edvakf/20090504/1241385507
>
> 2011年9月9日20:14 中村 千尋 <wow.nkm-chih...@bee-u.com>:

元木

unread,
Sep 12, 2011, 2:27:02 AM9/12/11
to android-g...@googlegroups.com

こんにちは、元木です。

本当に"鬼門"と書いてありますね。
ページの内容をよく読まずに
勧めてしまいました…。

混乱させてしまったようで、
申し訳ありません。

2011/09/12 15:05 "中村 千尋" <wow.nkm...@bee-u.com>:

Xiaoqi Yuan

unread,
Sep 12, 2011, 2:45:20 AM9/12/11
to android-g...@googlegroups.com
中村さん

こんにちは、おざき@初投稿です。

> 「%」はSQlite3 DBでワイルドカードと認識されるため、文字としての「%」検索ができません。

'$'でエスケープしましょう。

ご参考)
http://www.dbonline.jp/sqlite/select/index6.html

それでは、また。

2011/9/9 中村 千尋 <wow.nkm...@bee-u.com>:

> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
>
>

--
/***********************************************************************
小崎 元 / OZAKI, Hajime / Xiaoqi Yuan
---------------------------------------------------------------------
E-Mail: xiaoq...@apps.senote.org
Website: http://www.senote.org Twitter: @xiaoqiyuan
***********************************************************************/

中村 千尋

unread,
Sep 12, 2011, 11:37:24 PM9/12/11
to 日本Androidの会
To:元木様、おざき様

お世話になっております。
中村です。
長文失礼致します。

元木様、おざき様、ご助言ありがとうございます。
お二人に頂いたアドバイスを元に、以下のような実装を行いました。
 ・検索文字列に半角「%」があった場合はその部分を「$%」に置換
 ・SQLメッセージに『$をエスケープ文字にする』ことを明記
 ・プレースホルダを使用し、検索文字列を動的に付与

実装例は以下のような感じです。
(※不要な方は★終わり★まで読み飛ばして下さい)

=★始まり★=====================================
private void testPtnMatch(String seekStr){

String sqlMsg = "select _str_id, _str_title, _str_msg from
my_test_tbl where _str_title like ?1 or _str_msg like ?2";

// 文字列に一つでも「%」があったら
if( seekStr.indexOf("%") >= 0 ){
char[] ch_seekStr = seekStr.toCharArray();
StringBuffer sb = new StringBuffer();
for(int i = 0 ; i < ch_seekStr.length ; i++){
if( ch_seekStr[i] == '%' ){
sb.append("$%");
} else {
sb.append(ch_seekStr[i]);
}
}
// 中身を入れ替え
seekStr = sb.toString();
sqlMsg += " ESCAPE '$'";
}

ArrayList<String[]> ary_rslt = new ArrayList<String[]>();
String[] ary_params = null;

SQLiteDatabase db = SQLiteOpenHelper.getReadableDatabase();
(※実際はSQLiteOpenHelperのStatic呼び出しはしていませんが、簡略化して記載します)

Cursor c = db.rawQuery( sqlMsg, new String[]{"%" + seekStr + "%",
"%" + seekStr + "%" } );
if( c.moveToFirst() ){
~レコードの値を利用する処理を実装~
}
if(!(c.isClosed())){
c.close();
}
}
=★終わり★=====================================

【結果】
上記の実装で、単独で「%」を入力された場合も「%%」のような形で入力された場合も
正常に検索できることを確認しました。

懸念点としまして、
『「$」と「%」の両方を含む文字列』を検索文字列として渡された場合に
どのような対応をすべきか悩んでおります。
安易に
『その場合はエスケープ文字列を「$」ではなく「@」にする』
といった対応を行っても、その次は
『「$」と「%」と「@」を含む文字列を渡されたら・・・』
といった感じでいたちごっこになってしまう気がしております。

本スレッドの質問自体は無事に解決しましたので、
これから上記の解決方法を調査しようと思います。

元木様、おざき様、繰り返しになりますが、ご助力ありがとうございました。

以上、よろしくお願い致します。
Reply all
Reply to author
Forward
0 new messages