[三流君] −−> [ASPで遊ぶ、失敗する] −−> [バックナンバー一覧]
−−> No.087 ADO SQL Like演算子で部分検索する

ADO SQL Like演算子で部分検索する


本文(発行内容)


<ADO SQL Like演算子で部分検索する>

こんにちは、三流プログラマーのKen3です。 今回は、Like演算子で部分検索を行ってみます

/* * 1.今回のキッカケ */

掲示板 http://www.ken3.org/cgi-bin/bbs/asp/wforum.cgi でもらった質問、処理していないのがあるので、 1つ1つやらないとなぁと思いつつ・・・

/* * 2.Like演算子を使用した検索 */

SQL Select Where文で、検索したりしてました。 Select * From KANSOU WHERE F_KUBUN = 'ASP' ORDER BY WriteTime DESC http://www.ken3.org/cgi-bin/test/test030-1.asp?KUBUN=ASP と F_KUBUN フィールドが'ASP'のデータをセレクトしたり Select * From KANSOU Where F_KUBUN = 'ASP' OR F_KUBUN = 'VBA' ORDER BY WriteTime DESC http://www.ken3.org/cgi-bin/test/test046-1.asp?ASP=on&VBA=on や Select * From KANSOU WHERE F_KUBUN IN ('ASP', 'VBA') ORDER BY WriteTime DESC http://www.ken3.org/cgi-bin/test/test046-3.asp?KUBUN=ASP&KUBUN=VBA で、 F_KUBUNが'ASP'か'VBA'のデータをセレクトしたり。 > 10 で10より上, < 20 で20より下と数値も普通に使えたりします。 あとは、部分的にデータが一致したら、検索したい、そんな要望もあると思います。 例えば、 http://www.ken3.org/cgi-bin/test/test083-1.asp で Select TOP 20 URL, Count(URL) As URLCNT From log GROUP BY URL   ORDER BY Count(URL) DESC とSQL文を発行して、TOP20の合計値を出力しています。 No. URL 訪問者件数 1 /etc/ranking/auto_04.html 639人 2 /etc/500yen/ebank.html 591人 3 /etc/ranking/hobby_07.html 478人 ・ ・ ・ ・   ・ ・ 18 /etc/pc.html 206人 19 /etc/ranking/media_07.html 199人 20 /etc/ranking/hobby_06.html 189人 これだと、全てのデータのランキングです。 これを、hobby_XXだけを出力したい、そんな時があると思います。 そんな時に便利なのが、 Like 演算子です。 Where フィールド Like '%hobby%' と 指定すると、フィールドにhobbyが含まれているデータを取得してくれます。 http://www.ken3.org/cgi-bin/test/test087-1.asp?q=drink と q=XXXXみたいにURLに載せたパラメータを取得して、 SQL文を作成してみたいと思います。

/* * 3.作成したサンプル */

えっと、まずは、 http://www.ken3.org/cgi-bin/test/test087-1.asp?q=pc みたいに、q=の値を受け取らないとなぁ。 SQL文の作成時に、 Request.QueryString("q") の値があるか、チェックして、存在したときにLike演算子を使用します。 ※強引に受け取ったパラメータに%を追加してます。 'TOP20を指定 Where URL LIKE '%XXX%'で条件を指定する strSQL = "Select TOP 20 URL, Count(URL) As URLCNT " strSQL = strSQL & "From log " 'パラメータをチェックする(test087-1.asp?q=xxxxxでもらう) qqq = Trim(Request.QueryString("q")) '両端のスペースを除いて受け取る If qqq <> "" Then 'データありの時、Like演算子の条件を追加する strSQL = strSQL & "Where URL Like '%" & qqq & "%' " Response.Write "条件[" & qqq & "]を受け取りました<br>" Else Response.Write "q=のパラメータが無かったよ(笑)<br>" 'データ無しの時 End If strSQL = strSQL & "GROUP BY URL " strSQL = strSQL & "ORDER BY Count(URL) DESC" こんな感じで、SQL文を作成して、発行してます。 あとは、再検索用に、 <FORM ACTION="test087-1.asp" METHOD="GET"> 絞り込む検索条件を入れて、再検索ボタンを押してください。<br> 検索条件:<INPUT TYPE="TEXT" NAME="q" VALUE="<%=qqq%>"> <INPUT TYPE="submit" VALUE="再検索"><br> ※例)pc auto drink 500yenなどなど、URLの一部を入力<br> </FORM> と METHOD="GET"でフォームを作成して、 <INPUT TYPE="TEXT" NAME="q" VALUE="<%=qqq%>"> で条件を入力させ、 ACTION="test087-1.asp"の指定で、自分自身を再度コールしてます。 http://www.ken3.org/cgi-bin/test/test087-1.asp?q=old http://www.ken3.org/cgi-bin/test/test087-1.asp?q=500yen http://www.ken3.org/cgi-bin/test/test087-1.asp?q=fashion などで下記のプログラムのテストが出来ます。 test087-1.asp <%@LANGUAGE=VBScript%> <html> <head> <title>SQL SELECT WHERE句で Like演算子を使用して部分検索する</title> </head> <body> <!-- Ken3 --><!-- #include file="info.inc" --> <h1>SQL SELECT WHERE句で Like演算子を使用して部分検索する</h1> test087-1.asp<br> <hr> cnt_etc.mdb から訪問されたURLをグループ化して集計、降順に表示<br> <strong>Like演算子</strong>でデータを絞り込んでみました。<br> Select TOP 20 URL, Count(URL) As URLCNT 〜<br> <font color="red">Where URL <strong>Like</strong> '%XXXX%'<br> と受け取ったq=を設定してみます</font><br> <% 'ADO DB Connection オブジェクトを作成する、英文そのままじゃん Set db=Server.CreateObject("ADODB.Connection") '.Provider?プロバイダー?通信会社?じゃなくって 'データアクセスにはJet.OLEDB.4.0を使うことを設定 db.Provider = "Microsoft.Jet.OLEDB.4.0" '次に、接続DBの位置を渡すので、Server.MapPathで変換して渡す db.ConnectionString = Server.MapPath("cnt_etc.mdb") 'やっとデータベースを開ける db.open 'お約束のレコードセットの作成 'GROUP BY句 で グループ化 Count関数で集計 ORDER BY句で並べ替え 'TOP20を指定 Where URL LIKE '%XXX%'で条件を指定する strSQL = "Select TOP 20 URL, Count(URL) As URLCNT " strSQL = strSQL & "From log " 'パラメータをチェックする(test087-1.asp?q=xxxxxでもらう) qqq = Trim(Request.QueryString("q")) '両端のスペースを除いて受け取る If qqq <> "" Then 'データありの時、Like演算子の条件を追加する strSQL = strSQL & "Where URL Like '%" & qqq & "%' " Response.Write "条件[" & qqq & "]を受け取りました<br>" Else Response.Write "q=のパラメータが無かったよ(笑)<br>" 'データ無しの時 End If strSQL = strSQL & "GROUP BY URL " strSQL = strSQL & "ORDER BY Count(URL) DESC" 'オマケで画面にデータ表示 Response.Write "<hr>発行する(した)SQL文は<br><B><font color='green'>" Response.Write strSQL & "</font></B><br>です<hr>" Set rs = db.Execute(strSQL) 'データの表示をテーブルで行う Response.Write "<TABLE Border='1'>" '見出しをバカっぽく、そのまま書き込む Response.Write "<TR>" Response.Write "<TD>No.</TD>" Response.Write "<TD>URL</TD>" Response.Write "<TD>訪問者件数</TD>" Response.Write "</TR>" 'EOFまでループ nCNT = 1 Do While rs.EOF = False '.EOFがFalseの間 Response.Write "<TR>" '内容を表示する Response.Write "<TD>" & nCNT & "</TD>" Response.Write "<TD><A HREF='" & rs.Fields.Item("URL") & "' Target='_top'>" Response.Write rs.Fields.Item("URL") & "</A></TD>" Response.Write "<TD ALIGN=RIGHT>" & rs.Fields.Item("URLCNT") & "人</TD>" Response.Write "</TR>" & Chr(13) & Chr(10) '次のレコードにポインタを移動する rs.MoveNext 'これを忘れると悲惨なことに、、、 'カウンタを増やす nCNT = nCNT + 1 Loop Response.Write "</TABLE>" 'テーブルは終わりです '開いていたレコードセットを閉じる rs.Close 'データベースも閉じようよ db.Close 'お行儀よくオブジェクトも開放しましょう(通常は自動的に解放されるけど) Set db = Nothing %> <hr> <FORM ACTION="test087-1.asp" METHOD="GET"> 絞り込む検索条件を入れて、再検索ボタンを押してください。<br> 検索条件:<INPUT TYPE="TEXT" NAME="q" VALUE="<%=qqq%>"> <INPUT TYPE="submit" VALUE="再検索"><br> ※例)pc auto drink 500yenなどなど、URLの一部を入力<br> </FORM> </body> </html>

/* * 4.Access97時代の*と間違えたことも在り */

お約束のネタだけど、 URL Like '*pc*' だと、ADOのSQLだとダメです。 けっこう、引っかかると思うので、%って感じで頭に入れて置いてください。 ※SQLの解析エンジンによって、違ったりするので、マニュアルみるかな・・・ http://www.microsoft.com/japan/developer/library/vdtsql/dvconusingwildcardcharacters.htm も参考にしてくださいね。 -【けんぞう!】--------------------------------------------------------- ASPが利用可能なレンタルサーバーをお探しのアナタ、 http://www.ken3.org/asp/server.html ← けんぞうも使っているサーバーの紹介 『おっIISでbasp21でメール送信、mdbも使えるよ』(三流PG:31歳) ------------------------------------------------------------------------ 

/* * 5.終わりの挨拶 </HTML> */

今回は、Like演算子を軽く書きました。 掲示板にあったのは、削除条件指定とページ送りでしょギク・・・ ハヤメにかたずけないと・・・ いろいろと問題点を残しつつ、脱線・寄り道の多いメルマガですが、 今後とも、よろしくお願いします。 何かの参考となれば幸いです。 ASP、VBScript勉強中の三流プログラマーのKen3でした。

フィードバック

ASP系の→[掲示板]←を覗く、質問を書き込む

評価・感想

No.087を読んだ満足度(評価)は?
5満足(参考になった)
4まぁまぁ(一部参考になった)
3普通(どちらとも言えない)
2なんかなぁ(期待と違った)
1不満(読んで損した気分)
作者に感想・質問を送る場合は下記に気軽に書いてください
あなたのお名前(ニックネーム) さん

作者からの返信は、 不用 E-mail で受信したい
*質問・感想はメルマガで紹介する場合があります

三流君の主なリンク先

[アクセスランキング] [サイトマップ] [リンク先・相互リンク先など]
ASPで遊ぶ、失敗する 掲示板 バックナンバー 登録と解除
三流プログラマー 業務の愚痴 掲示板 バックナンバー 登録と解除
VBAで楽しくプログラミング 掲示板 バックナンバー 登録と解除
コンビニのオモテとウラ話 掲示板 バックナンバー 登録と解除
www.ken3.org(サイト内)から Google を利用して、

Ken3の日記(weblog) -- [広告・副収入系] [プログラマー業務の愚痴] [VBA系の話題] [ASP系の話題] [コンビニ系ネタ] [その他]

その他 宣伝広告