• ベストアンサー

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 よろしくお願いいたします。

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

  • ベストアンサー
  • kakusuke
  • ベストアンサー率36% (95/259)
回答No.2

ちょっと間違えました。 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 こんな感じですね。

amile
質問者

お礼

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

その他の回答 (2)

回答No.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

amile
質問者

お礼

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

  • kakusuke
  • ベストアンサー率36% (95/259)
回答No.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

関連するQ&A