

JavaとSQLを使った検索機能を作成中です。  
フォーム画面の検索項目(氏名、氏名カナ、趣味のテキストボックス)に入力された値をSQL文のwhere
句に指定したプレースホルダーに埋めていく形でテーブルに対して取得したデータを画面に検索結果として表示させる形で考えています。  
仕様としてAND条件の形で検索し、検索項目は部分一致検索とします。加えて検索項目の個々に入力がなければ(空の場合)、その項目はレコードの絞りこみ対象として指定しない場合、どういうSQLを作成すれば良いでしょうか。SQL作成に悩んでいます。


CC BY-SA 3.0
2016-09-18T16:06:27.383
28970
2016-09-20T03:32:25.517
17348
question
java sql
検索機能のSQL作成について。


前提として条件に対する検索の値はPreparedStatementなどを使うとして、そこで指定するSQL文の流れとしては以下のような流れになるのではないでしょうか。

条件の総数を確認  
判断 指定がゼロ個である → WHERE句なし  
判断 指定がひとつである → WHERE句を作成し条件を入れる  
判断 指定がふたつ以上である → ひとつ目はWHERE句を作成し条件を入れる、ふたつ目からは  
AND条件を追加する。

入力の受け取り方によってコードの内容はfor文だったり配列へのアクセスだったりと変わると思うのですが、組み立てはあくまでも条件の総数に対して考えると良いかと思います。


CC BY-SA 3.0
2016-09-18T16:39:47.493
28971
2016-09-18T16:39:47.493
15330
28970
answer


各検索項目に対して、入力が空で真になる条件と、部分一致検索で真になる条件を `OR` 演算子でつなぎます。  
入力が空であれば検索条件が無視されて、入力が空でない場合のみ部分一致検索が反映されます。

例を挙げると、下記のスキーマに対して

[code]

    CREATE TABLE Tbl
    ( col1 VARCHAR(10) NOT NULL
    , col2 VARCHAR(10) NOT NULL
    );
    
[/code]

`col1, col2` に対するクエリは、パラメータ `:1` 〜 `:4` を用いて下記のように書けます。  
(パラメータ `:1, :2` が `col1` の検索入力。パラメータ `:3, :4` が `col2` の検索入力)

[code]

    SELECT col1, col2
    FROM Tbl
    WHERE (NULLIF(:1, '') IS NULL OR col1 LIKE ('%' || :2 || '%'))
      AND (NULLIF(:3, '') IS NULL OR col2 LIKE ('%' || :4 || '%'))
    ORDER BY col1, col2
    ;
    
[/code]

各 RDBMS ごとにパラメータ等の記述が異なるので、そのままで動かなければ調整してください。  
例: [MySQL の実行結果](http://www.sqlfiddle.com/#!9/196a8/4 "SQL Fiddle")


CC BY-SA 3.0
2016-09-20T03:32:25.517
28993
2016-09-20T03:32:25.517
8431
28970
answer