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

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

新規登録して質問してみよう
ただいま回答率
85.48%
JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

3123閲覧

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

kitten

総合スコア25

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2019/03/19 04:18

編集2019/03/20 04:19

前提・実現したいこと

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

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

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

該当のソースコード

JSP

1<%@page import="java.util.*"%> 2<%@page import="java.sql.*"%> 3 4<%@ page language="java" contentType="text/html; charset=UTF-8" 5 pageEncoding="UTF-8"%> 6<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 7<html> 8<head> 9<meta http-equiv="Content-Type" content="text/html; charset="UTF-8"> 10 11<title>検索結果画面</title> 12</head> 13<body> 14 15 16<% 17 //変数定義 18 Connection conn = null; 19 PreparedStatement ps = null; 20 ResultSet rs = null; 21 22 try { 23 24 String dbURL = "jdbc:postgresql://localhost:5432/testdb"; 25 String user = "postgres"; 26 String pass = "takahashi"; 27 String key = "%"; 28 29 if(request.getParameter("key") != null) { 30 if(request.getParameter("key") != "") { 31 key = request.getParameter("key") + "%"; 32 } 33 } 34 35 System.out.println("*** key = " + key); 36 37 conn = DriverManager.getConnection(dbURL, user, pass); 38 39 40 String sql = "SELECT * from search_gaityu WHERE customer ILIKE ? or prodname ILIKE ? or partname ILIKE ? or part2name ILIKE ? or partcode ILIKE ? "; 41 42 ps = conn.prepareStatement(sql); 43 key = key.replace("*", "%"); 44 ps.setString(1, key); 45 ps.setString(2, key);//ok 46 ps.setString(3, key); 47 ps.setString(4, key); 48 ps.setString(5, key);//ok 49 50 51 52 //SELECTを実行する 53 rs = ps.executeQuery(); 54 55 //取得した結果を全件出力する 56 //out.println("<div class="table-scroll">"); 57 out.println("<table>"); 58 out.println("<tr><th>取引先</th><th>製品名</th><th>部品名</th><th>部品名2</th><th>部品コード</th><th>仕入値</th><th>備考</th</tr>"); 59 while(rs.next()){ 60 out.println("<tr>"); 61 out.print("<td>" + rs.getString("customer") + "</td>"); 62 out.print("<td>" + rs.getString("prodname") + "</td>"); 63 out.print("<td>" + rs.getString("partname") + "</td>"); 64 out.print("<td>" + rs.getString("part2name") + "</td>"); 65 out.print("<td>" + rs.getString("partcode") + "</td>"); 66 out.print("<td>" + rs.getString("stkvalue") + "</td>"); 67 out.print("<td>" + rs.getString("other") + "</td>"); 68 out.println("</tr>"); 69 } 70 out.println("</table>"); 71 //out.println("</div>"); 72 73 } catch (SQLException ex) { 74 ex.printStackTrace(); 75 } finally { 76 try { 77 if (conn != null && !conn.isClosed()) { 78 conn.close(); 79 } 80 } catch (SQLException ex) { 81 ex.printStackTrace(); 82 } 83 } 84%> 85</body> 86</html> 87

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

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

dump

1-- 2-- PostgreSQL database dump 3-- 4 5-- Dumped from database version 11.1 6-- Dumped by pg_dump version 11.1 7 8SET statement_timeout = 0; 9SET lock_timeout = 0; 10SET idle_in_transaction_session_timeout = 0; 11SET client_encoding = 'UTF8'; 12SET standard_conforming_strings = on; 13SELECT pg_catalog.set_config('search_path', '', false); 14SET check_function_bodies = false; 15SET client_min_messages = warning; 16SET row_security = off; 17 18SET default_tablespace = ''; 19 20SET default_with_oids = false; 21 22-- 23-- Name: search_gaityu; Type: TABLE; Schema: public; Owner: postgres 24-- 25 26CREATE TABLE public.search_gaityu ( 27 customer character(80), 28 prodname character(80), 29 partname character(80), 30 part2name character(80), 31 partcode character(80), 32 stkvalue character(80), 33 other character(80) 34); 35 36 37ALTER TABLE public.search_gaityu OWNER TO postgres; 38 39-- 40-- Data for Name: search_gaityu; Type: TABLE DATA; Schema: public; Owner: postgres 41-- 42 43COPY public.search_gaityu (customer, prodname, partname, part2name, partcode, stkvalue, other) FROM stdin; 44(有)横山研磨 \N レバー \N 3232 059 0040 2 \N 45(有)横山研磨 TJ-35P2-BC/40A コンタクトノーズB \N \N 4,000.00 一式(100個) 46(有)横山研磨 TJ-35P2-BC/40A コンタクトノーズB \N \N 4,000.00 一式(200個) 47(有)横山研磨 TJ-35P2-BC/40A コンタクトノーズB \N \N 4,000.00 一式(300個) 48(有)横山研磨 TJ-35P2-BC/40A コンタクトノーズB \N \N 4,000.00 一式(360個) 49 50-- 51-- PostgreSQL database dump complete 52--

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/03/19 04:33

ILIKE ってなんでしょう
m.ts10806

2019/03/19 04:36

何れでHTMLフォームから検索しても = OR検索 ということでよろしいでしょうか。
kitten

2019/03/19 04:42

ILIKE は簡単に説明させて頂くと大文字と小文字を区別せずに検索するためのものです。 はい。その解釈で問題ありません。 分かりにくくてすみません...。
m.ts10806

2019/03/19 04:44

>ILIKE は簡単に説明させて頂くと 失礼。私が知らないだけでした(あまりこの条件使わないもので)
m.ts10806

2019/03/19 04:48 編集

質問文に提示されているカラム名がコードと一致しませんが、 これはどちらが正しいですか?前の質問からするとコードのように思いますが。 >(customer,prodname,partname,part2name,partcode) > out.print("<td>" + rs.getString("customer") + "</td>"); out.print("<td>" + rs.getString("pname") + "</td>"); out.print("<td>" + rs.getString("parts") + "</td>"); out.print("<td>" + rs.getString("parts2") + "</td>"); out.print("<td>" + rs.getString("stock") + "</td>"); out.print("<td>" + rs.getString("other") + "</td>"); out.print("<td>" + rs.getString("other2") + "</td>");
sazi

2019/03/19 04:48

>@mts10806さん ILIKEは、postgres の大文字/小文字を区別しないlikeです。
kitten

2019/03/19 04:50

失礼いたしました。コードが古いものでした。 修正しておきます。
sazi

2019/03/19 04:52

製品名(prodname)と部品コード(partcode)の2項目では取得できているとのことですが、 それを、取引先と部品名の項目に条件を変えたもので取得できないという事ですか? 製品名(prodname)と部品コード(partcode)で取得できている部分のコードも追加して貰えますか?
kitten

2019/03/19 05:04

>@saziさん ご回答ありがとうございます。 該当ソースコード中央付近の String sql = "SELECT * from search_gaityu WHERE customer ILIKE ? or prodname ILIKE ? or partname ILIKE ? or part2name ILIKE ? or partcode ILIKE ? "; でprodnameとpartcodeは上手く効いていて検索出来ているということです。
m.ts10806

2019/03/19 05:05

CREATE文とサンプルデータのINSERT文を提示されたほうがいいかもしれません。 あとどのようなキーワードを投入した、とか。
kitten

2019/03/19 05:19

>@mts10806さん CREATE文とINSERT文についてもう少し具体的に教えていただけるとありがたいです。 データベース内のお話でしょうか?
m.ts10806

2019/03/19 05:20

はい。 テーブルのCREATE TABLE文、サンプルデータのINSERT文 要は、他の人に現在のDB内の状態を再現してもらうためのSQL(データのダンプ)です。
kitten

2019/03/20 04:11

dumpの作成に手間取ってしまいましたが 出来ましたので質問本文に添付しておきます。
sazi

2019/03/20 04:31

ダンプって、create table文とinselet文で回答者の環境でサンプルデータを作るセットの事です。 そもそもそのdumpだと色々と手間です。
kitten

2019/03/20 04:44

失礼しました。CREATE文は上記ダンプファイルの通り 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) );  になります。 INSERT文はCOPYコマンドでエクセルを csvに変換したものをインポートしているのでしておりません。 テーブルデータはcustomerとpartnameの2列が日本語で それ以外は半角英数字のテーブルとなっております。
m.ts10806

2019/03/20 04:45

すみません。私の表現が悪かったですね^^;
sazi

2019/03/20 05:10

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

2019/03/20 05: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 05:43

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

回答1

0

ベストアンサー

DATA

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

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

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

SQL

1SELECT * from search_gaityu 2WHERE customer ILIKE '%' 3 or prodname ILIKE '%RB441T(CE)%' 4 or partname ILIKE '%' 5 or part2name ILIKE '%' 6 or partcode ILIKE '%RB12625%'

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

SQL

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

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

SQL

1SELECT * from search_gaityu 2WHERE customer ILIKE '%RB441T(CE)%' 3 or prodname ILIKE '%RB441T(CE)%' 4 or partname ILIKE '%RB441T(CE)%' 5 or part2name ILIKE '%RB441T(CE)%' 6 or partcode ILIKE '%RB441T(CE)%'

単一の検索項目なら、

SQL

1SELECT * from search_gaityu 2WHERE customer ILIKE '%神澤工業所%' 3 or prodname ILIKE '%神澤工業所%' 4 or partname ILIKE '%神澤工業所%' 5 or part2name ILIKE '%神澤工業所%' 6 or partcode ILIKE '%神澤工業所%'

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

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

投稿2019/03/20 05:39

編集2019/03/20 05:56
sazi

総合スコア25188

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kitten

2019/03/20 06:23

ご回答ありがとうございます。 エンコードは全てUTF-8で統一したりそのうえでIEで開いてみたりしましたが 結果は同じでした。またダメ元でEUC-JPでもやってみましたがやはりダメでした。 うーん...prodnameとpartcodeの2カラムで検索が出来ている時点で 複数検索は出来ているものと判断してよさそうですけども何故でしょうか...。
sazi

2019/03/20 06:35 編集

実際に発行されているSQL文を確認されましたか? SQLトレースだと確実だと思います。 https://qiita.com/u-chida/items/2dc7fc2e386edde1c421 で、ログをutf8で開いて条件が文字化けしていないかどうかを確認する。
kitten

2019/03/20 06:47

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

2019/03/20 07:03

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

2019/03/22 05:58

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問