[三流君] −−>
[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系の→[掲示板]←を覗く、質問を書き込む
評価・感想
三流君の主なリンク先
[アクセスランキング]
[サイトマップ]
[リンク先・相互リンク先など]
Ken3の日記(weblog) --
[広告・副収入系]
[プログラマー業務の愚痴]
[VBA系の話題]
[ASP系の話題]
[コンビニ系ネタ]
[その他]
その他 宣伝広告