• 締切済み

複数条件による検索

現在strutsを使用した「検索フォーム」を作成しています。 検索項目は6つあり、それぞれNOT NULLの項目と、NULL可の項目が あります。 全部NOT NULLですと、WHERE句で 「WHERE 項目A = '%?%'」 を条件にすればよいと思うのですが、NULL可の場合は 「WHERE 項目B = '%?%' OR 項目 IS NULL 」 となると思います。 しかしこれですと項目Bに検索条件で入力したものと NULL値のものが両方ヒットしてしまいます・・・ うまく文章がまとまらなくてとても恐縮ですが、 うまく構文を作る方法はないでしょうか・・・。 よろしくお願いします。

みんなの回答

回答No.2

-------------------------- 項目A(必須)[          ] 項目B(必須)[          ] 項目C(必須)[          ] 項目D    [          ] 項目E    [          ] 項目F    [          ]                       【検索】 -------------------------- ↑ [ ]はテキストボックス ↑ 【 】はボタン たとえば、よくあるこんなフォームで検索するような 検索結果を得るイメージだとして話を進めます。 それぞれのテキストボックスには、項目Aならname="textA" のように名前が割り当てます。 結果を取得するSQLを作成するときに sql = "" sql += ' select * '; sql += ' from hoge_table '; // // 必須入力項目であるA~Bは、必ず検索の対象とする。 // sql += ' where COLUMN_A like \'%' + request.getParameter('textA') + '%\' '; sql += ' and COLUMN_B like \'%' + request.getParameter('textB') + '%\' '; sql += ' and COLUMN_B like \'%' + request.getParameter('textC') + '%\' '; // // 入力が必須でないD~Fは、文字の入力があった場合のみ検索条件に含める。 // if (request.getParameter('textD') == '') { sql += ' and COLUMN_B like \'%' + request.getParameter('textD') + '%\' '; } if (request.getParameter('textE') == '') { sql += ' and COLUMN_B like \'%' + request.getParameter('textE') + '%\' '; } if (request.getParameter('textF') == '') { sql += ' and COLUMN_B like \'%' + request.getParameter('textF') + '%\' '; } とすることで実現できるのではないでしょうか? もし設定が的外れでしたらすみません。 補足のご説明をお願いします。

hiromi4124
質問者

お礼

ありがとうございます!。 そうですね。必須項目以外は入力があった場合のみ検索の対象に すればいいんですよね・・・。 その考えがありませんでした。 助かりました、ありがとうございます。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

>全部NOT NULLですと、WHERE句で >「WHERE 項目A = '%?%'」 「=」になっていますが、LIKEをつかうということ? LIKEで前方後方一致はSQLとしては推奨されません。 「WHERE 項目A != ''」 とかの方がよいのでは? >NULL可の場合は >「WHERE 項目B = '%?%' OR 項目 IS NULL 」 >となると思います。 「WHERE 項目B != '' AND 項目 IS NOT NULL 」 的な処理でよいのでは? 場合によってはCOALESCE()で処理する方がいいかも・・・