質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.59%

JSP SQL文where句で複数カラムで検索したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,510

score 25

前提・実現したいこと

前回の質問のあと分からないことが新たに
出ましたので質問させていただきます。

実現したいことと致しましては
前回と変わらず、7つあるカラムの内の5つ(customer,prodname,partname,part2name,partcode)
の何れでHTMLフォームから検索しても必要行を取得することです。

尚、項目を分かり易くするためカラム名を変更しております。

該当のソースコード

<%@page import="java.util.*"%>
<%@page import="java.sql.*"%>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset="UTF-8">

<title>検索結果画面</title>
</head>
<body>


<%
    //変数定義
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;

    try {

        String dbURL = "jdbc:postgresql://localhost:5432/testdb";
        String user = "postgres";
        String pass = "takahashi";
        String key = "%";

        if(request.getParameter("key") != null) {
            if(request.getParameter("key") != "") {
                key = request.getParameter("key") + "%";
            }
        }

        System.out.println("*** key = " + key);

        conn = DriverManager.getConnection(dbURL, user, pass);


        String sql = "SELECT * from search_gaityu WHERE customer ILIKE ? or prodname ILIKE ? or partname ILIKE ? or part2name ILIKE ? or partcode ILIKE ? ";

        ps = conn.prepareStatement(sql);
        key = key.replace("*", "%");
        ps.setString(1, key);
        ps.setString(2, key);//ok
        ps.setString(3, key);
        ps.setString(4, key);
        ps.setString(5, key);//ok



        //SELECTを実行する
        rs = ps.executeQuery();

        //取得した結果を全件出力する
        //out.println("<div class="table-scroll">");
        out.println("<table>");
        out.println("<tr><th>取引先</th><th>製品名</th><th>部品名</th><th>部品名2</th><th>部品コード</th><th>仕入値</th><th>備考</th</tr>");
        while(rs.next()){
            out.println("<tr>");
            out.print("<td>" + rs.getString("customer") + "</td>");
            out.print("<td>" + rs.getString("prodname") + "</td>");
            out.print("<td>" + rs.getString("partname") + "</td>");
            out.print("<td>" + rs.getString("part2name") + "</td>");
            out.print("<td>" + rs.getString("partcode") + "</td>");
            out.print("<td>" + rs.getString("stkvalue") + "</td>");
            out.print("<td>" + rs.getString("other") + "</td>");
            out.println("</tr>");
        }
        out.println("</table>");
        //out.println("</div>");

    } catch (SQLException ex) {
        ex.printStackTrace();
    } finally {
        try {
            if (conn != null && !conn.isClosed()) {
                conn.close();
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }
%>
</body>
</html>

ダンプファイル(必要最低限のみ)

重要な部分は上部の情報だと思ったのでレコード自体は一部のみあげております。

--
-- PostgreSQL database dump
--

-- Dumped from database version 11.1
-- Dumped by pg_dump version 11.1

SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET client_min_messages = warning;
SET row_security = off;

SET default_tablespace = '';

SET default_with_oids = false;

--
-- Name: search_gaityu; Type: TABLE; Schema: public; Owner: postgres
--

CREATE TABLE public.search_gaityu (
    customer character(80),
    prodname character(80),
    partname character(80),
    part2name character(80),
    partcode character(80),
    stkvalue character(80),
    other character(80)
);


ALTER TABLE public.search_gaityu OWNER TO postgres;

--
-- Data for Name: search_gaityu; Type: TABLE DATA; Schema: public; Owner: postgres
--

COPY public.search_gaityu (customer, prodname, partname, part2name, partcode, stkvalue, other) FROM stdin;
(有)横山研磨                                                                             \N    レバー                                                                                \N    3232 059 0040                                                                       2                                                                                   \N
(有)横山研磨                                                                             TJ-35P2-BC/40A                                                                      コンタクトノーズB                                                                          \N    \N    4,000.00                                                                            一式(100個)                                                                        
(有)横山研磨                                                                             TJ-35P2-BC/40A                                                                      コンタクトノーズB                                                                          \N    \N    4,000.00                                                                            一式(200個)                                                                        
(有)横山研磨                                                                             TJ-35P2-BC/40A                                                                      コンタクトノーズB                                                                          \N    \N    4,000.00                                                                            一式(300個)                                                                        
(有)横山研磨                                                                             TJ-35P2-BC/40A                                                                      コンタクトノーズB                                                                          \N    \N    4,000.00                                                                            一式(360個)                                                                        

--
-- PostgreSQL database dump complete
--

発生している問題・エラーメッセージ

前回と同じ表で説明させて頂きます。
現状といたしましては以下の製品名(prodname)と部品コード(partcode)の2項目は
検索フォームに入力して下記の1行をとってくることが出来るのですが
取引先と部品名からとってくることがどうしてもできません。
ここ             ここ
↓              ↓         
取引先    製品名    部品名 部品名2 部品コード 仕入値 備考
神澤工業所    RB441T(CE)    ツメベース           RB12625    5.00  
```

試したこと

取引先と部品名の項目に含まれているデータは日本語なので
エンコードの問題かと思い全て(html.jspファイル共に保存時にUTF8設定
HTMLにmeta charset="UTF-8"の追加)UTF-8で統一したのですが
状況は変わらず日本語で検索するとカラム名だけが上部に表示される状況です。
解決策を頂けると助かります。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • sazi

    2019/03/20 14:10

    サンプルデータはsearch_gaityu をselectしたものから幾つかピックアップして下さい
    insert文が難しければ表でも良いかと思います。
    そのサンプルデータから、SQL文で正しく取れれば問題はSQLでは無いという切り分けになります。

    キャンセル

  • kitten

    2019/03/20 14:42

    >@saziさん
    今、PostgreSQLで以下のSQLを試してやってみたんですがこういう事でよろしいでしょうか?
    testdb=# select partname from search_gaityu where partname = 'コンタクトノーズB';
    partname
    ----------------------------------------------------------------------------------
    コンタクトノーズB
    コンタクトノーズB
    コンタクトノーズB
    コンタクトノーズB
    コンタクトノーズB
    コンタクトノーズB
    コンタクトノーズB
    コンタクトノーズB
    (8 行)

    testdb=# select customer from search_gaityu where customer='(有)横山研磨';
    customer
    ---------------------------------------------------------------------------------------
    (有)横山研磨
    (有)横山研磨
    (有)横山研磨
    (有)横山研磨
    (有)横山研磨
    (有)横山研磨
    (有)横山研磨
    (有)横山研磨
    (有)横山研磨
    (有)横山研磨
    (有)横山研磨
    (有)横山研磨
    -- More --

    キャンセル

  • kitten

    2019/03/20 14:43

    >@mts10806さん
    いえいえ。私の理解力が乏しいだけですので...。

    キャンセル

回答 1

checkベストアンサー

0

CREATE TABLE search_gaityu (
    customer character(80),
    prodname character(80),
    partname character(80),
    part2name character(80),
    partcode character(80),
    stkvalue character(80),
    other character(80)
);
insert into search_gaityu values 
 ('神澤工業所','RB441T(CE)','ツメベース',Null,'RB12625','5.00',Null)
,('(有)横山研磨','TJ-35P2-BC/40A','コンタクトノーズB',Null,Null,'4,000.00','一式(100個)')
;

製品名(prodname)と部品コード(partcode)の2項目は
検索フォームに入力して下記の1行をとってくることが出来るのですが

以下のSQLで試してみましたが、絞り込みはされません。

SELECT * from search_gaityu 
WHERE customer ILIKE '%' 
   or prodname ILIKE '%RB441T(CE)%' 
   or partname ILIKE '%' 
   or part2name ILIKE '%' 
   or partcode ILIKE '%RB12625%' 


以下なら絞り込みはされます。

SELECT * from search_gaityu 
WHERE prodname ILIKE '%RB441T(CE)%' 
   or partcode ILIKE '%RB12625%' 


パラメータの指定が無い項目を、orで何でもいいという条件なので、絞り込みはされないはずです。
以下の様に同じパラメータ内容なら絞り込みはされますが、複数のパラメータには対応していません。

SELECT * from search_gaityu 
WHERE customer ILIKE '%RB441T(CE)%' 
   or prodname ILIKE '%RB441T(CE)%' 
   or partname ILIKE '%RB441T(CE)%' 
   or part2name ILIKE '%RB441T(CE)%' 
   or partcode ILIKE '%RB441T(CE)%' 


単一の検索項目なら、

SELECT * from search_gaityu 
WHERE customer ILIKE '%神澤工業所%' 
   or prodname ILIKE '%神澤工業所%' 
   or partname ILIKE '%神澤工業所%' 
   or part2name ILIKE '%神澤工業所%' 
   or partcode ILIKE '%神澤工業所%' 


のように行って取得は出来ています。

SQLに問題ないなら、NGな項目は日本語ですので、文字コードの確認ですね。
postgresの文字コードを確認して下さい。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/20 15:47

    おもいっきり文字化けしていました。
    *** key = %
    *** key = ?¶?×?°≫?????%
    *** key = RB12633%
    上から1,2,3とすると
    1は何も入力せずに検索しに行った場合
    2は日本語で検索した場合
    3は半角英数字で検索した場合  です。
    提示して下さったURLを参考に設定を変えてみましたがダメでした。

    キャンセル

  • 2019/03/20 16:03

    リンクはトレースログを有効にするというだけですよ。
    SQLではなく、Keyの内容を確認されて文字化けしているのなら、ブラウザでのエンコーディングとかですかね。
    JSPが文字化けしたときの対処
    https://qiita.com/d-yosh/items/c04e0e686f7dc75a8529

    キャンセル

  • 2019/03/22 14:58

    結局JSPやらTomcatやらPostgreSQLやらいじっても
    どうにもならなかったので、HTMLのfromタグ method="post"を
    getに変えることで解決できました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る