こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

1つのテキストボックスに入力された複数のキーワードで検索する方法

開発言語はASPで、DBはSQL Serverを使用して、
現在プログラムの勉強をしております。

Search.aspというファイルで、
1つのテキストボックスに、
例えば、 佐藤 鈴木 のように入力し、
複数のキーワードで OR 検索をしたいのですが。

現在は下記のようなSQLを書いているのですが、
1つのキーワードでしか検索できませんので、
複数のキーワードで検索できるようにするには、
どのようにSQL及び、プログラムを記述したら良いのでしょうか。

dim name

name = Request("name")

sql = "select * from TABLE "
sql = sql & "WHERE id <> 0 "

if name <> "" then
sql = sql & " AND (name LIKE '%" & name & "%')
end if

よろしくお願いいたします。

投稿日時 - 2005-01-18 23:46:08

QNo.1174640

困ってます

質問者が選んだベストアンサー

ちょっと間違えました。

flgFirst = True

If Trim(name) <> "" Then
____'両端のスペースを除去後、空文字列かどうかを調べる
____If InStr(1, Trim(name), " ", 1) > 0 Or InStr(1, Trim(name), " ", 1) > 0 Then
________'文字列と文字列の間にスペースが無いかのチェック
________strBuffer01 = ""
________'全角スペースは半角スペースに置換
________strBuffer02 = RePlace(Trim(name), " ", " ")
________Do Until strBuffer02 = ""
____________'スペースまでを切り取る
____________If InStr(1, strBuffer02, " ", 1) > 0 Then
________________strBuffer01 = Left(strBuffer02, InStr(1, strBuffer02, " ", 1))
________________strBuffer02 = Mid(strBuffer02, Len(strBuffer01) + 1)
____________Else
________________strBuffer01 = strBuffer02
________________strBuffer02 = ""
____________End If

____________If Trim(strBuffer01) <> "" Then
________________If flgFirst = True Then
____________________sql = sql & " AND ((name LIKE '%" & Trim(strBuffer01) & "%') "
____________________flgFirst = False
________________Else
____________________sql = sql & " OR ((name LIKE '%" & Trim(strBuffer01) & "%') "
________________End If
____________End If
________Loop
________sql = sql & ") "
____End If
End If

こんな感じですね。

投稿日時 - 2005-01-19 01:50:06

お礼

ご丁寧な回答ありがとうございました。おかげさまでうまく動作しました。

投稿日時 - 2005-01-22 08:32:50

このQ&Aは役に立ちましたか?

8人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

試してないですが、

Dim myArray
Dim myVar
Dim sqlWhere

myArray = Split(Trim(name), " ", -1, 1)
For Each myVar In myArray
sqlWhere = sqlWhere & "(name LIKE '%" & myVar & "%') AND "
Next

sqlWhere = Left(myWhere, Len(myWhere) - 5)

とか。
解説:
Trim で両端のスペースを削除(全半角は同一で処理)
Split でスペース(全半角は同一視)を区切り文字として配列に格納
For Each で配列をループさせながら WHERE 句を作成
最後にお尻についた余計な「 AND 」の5文字を削除

てなのはどうでしょうかね。
ただしこのままだとダブルクォーテーションやらシングルクォーテーションを入力した場合の手当をしないとダメです。
' を '' 、 " を "" って二重化してあげないと。
それは別関数を作ってそっちに配列のループの中で myVar を投げて、Replace 関数で " を "" に、' を '' に入れ替えてあげるといいかも。

SQL 的に他に禁止文字があったような気がするなぁ・・・
「|」はダメだったかなぁ・・・

Trim 関数
http://www.microsoft.com/japan/msdn/library/ja/script56/html/vsfctLTrim.asp

Split 関数
http://www.microsoft.com/japan/msdn/library/ja/script56/html/vsfctSplit.asp

For Each ステートメント
http://www.microsoft.com/japan/msdn/library/ja/script56/html/vsstmForEach.asp

Left 関数
http://www.microsoft.com/japan/msdn/library/ja/script56/html/vsfctLeft.asp

Len 関数
http://www.microsoft.com/japan/msdn/library/ja/script56/html/vsfctLen.asp

Replace 関数
http://www.microsoft.com/japan/msdn/library/ja/script56/html/vsfctReplace.asp

投稿日時 - 2005-01-19 22:47:25

お礼

ありがとうございました。クォーテーションなども考慮しないとダメですね。非常に参考になりました。

投稿日時 - 2005-01-22 08:34:19

ANo.1

見た感じで、
VBScirptを前提に。
_を半角スペースに置換してお使いください。

If Trim(name) <> "" Then
____'両端のスペースを除去後、空文字列かどうかを調べる
____If InStr(1, Trim(name), " ", 1) > 0 Or InStr(1, Trim(name), " ", 1) > 0 Then
________'文字列と文字列の間にスペースが無いかのチェック
________strBuffer01 = ""
________'全角スペースは半角スペースに置換
________strBuffer02 = RePlace(Trim(name), " ", " ")
________Do Until strBuffer02 = ""
____________'スペースまでを切り取る
____________If InStr(1, strBuffer02, " ", 1) > 0 Then
________________strBuffer01 = Left(strBuffer02, InStr(1, strBuffer02, " ", 1))
________________strBuffer02 = Mid(strBuffer02, Len(strBuffer01) + 1)
____________Else
________________strBuffer01 = strBuffer02
________________strBuffer02 = ""
____________End If

____________If Trim(strBuffer01) <> "" Then
________________sql = sql & " AND (name LIKE '%" & Trim(strBuffer01) & "%')
____________End If
________Loop
____End If
End If

投稿日時 - 2005-01-19 01:44:06

あなたにオススメの質問