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

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

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

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

SQL

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

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

解決済

3回答

2288閲覧

ランダムに選ばれるフィールドをSQL文に入れ込む方法

退会済みユーザー

退会済みユーザー

総合スコア0

JSP

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

SQL

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

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

0グッド

0クリップ

投稿2016/04/10 11:22

編集2016/04/10 22:51

いつもありがとうございます。
JSPサーブレットSQLについてお聞きしたいのですが、任意のフィールドが3つのテーブルにまたがっており、IDに紐づいたレコードを抽出したいのですが、

Aテーブル
ID 性別 日付

Bテーブル
ID 体重 身長

Cテーブル
ID 名前 住所

ラジオボタンなどで検索時にチェックされた任意のフィールドを抽出するにはどのような記載をしていけば画面に表示できるのでしょうか。

ID検索時
○性別 ○日付 ○体重 ○身長 ○名前 ○住所 のいずれかが選択された場合なのですが、SQL文としては
select a + b + c + d
from テーブル
where ID=指定ID

となるかと思いますが、
<input type="checkbox" name="checkbox1" value="性別">
<input type="checkbox" name="checkbox1" value="日付">
<input type="checkbox" name="checkbox1" value="体重">
<input type="checkbox" name="checkbox1" value="身長">
<input type="checkbox" name="checkbox1" value="名前">
<input type="checkbox" name="checkbox1" value="住所">

こういったチェックボックスがいずれか複数選ばれた場合、どういうデータ運びをしてSQL文のselect文に落とし込むか悩んでおります。性別と身長を選んだ場合、名前と住所を選んだ場合など何通りもありif文でSQL文を複数記載するとなるとかなり骨が折れるので何かよい方法はないでしょうか。宜しくお願い致します。

【追記】

自身の行いたい内容を追加させてください。配列でcheckboxの中身をgetできるところまではできました。

例:性別と身長と住所にチェックを入れていた場合)
String配列で[性別,身長,住所]とgetはできました。

このあとなのですが、場合によっては6種類(日付、性別、身長・・・)とどれを選択してくるかわからないので、SQL文にどのように反映させるかという内容です。

6種類となると100通り程になってしまうのでSQL文をif文でわけると途方もない数のSQL文を用意しなければいけなく悩んでおります。よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

カラム名からテーブル名への対応表(JavaだとHashでしたっけDictionaryでしたっけ?)を用意しておいて指定されたカラム名から必要な表を取り出しFROMを組み立てます。表が最大でも3つなので数で条件分岐してもそんなややこしいことにはならないでしょう。列指定は単純にテーブル名+カラム名を連結していけば良いですね。

ただ、質問の内容を見る限り大したデータ量には見えないので、最初から全テーブルをJOINして全カラムを取り出して表示の時にフィルタする方が簡単です。

さて、質問のコードではチェックボックスの値にカラム名が入っていますが、これは避けた方がよいです。チェックボックスの値はただの番号か別の識別文字列にしておいて、アプリケーション側で対応表を用いてカラム名に変換するようにします。最初に書いた「カラム名からテーブル名への対応表」も実際にはこの番号か識別文字列からテーブル名への対応表となります。フォームのリクエストは簡単に捏造できますので、生のカラム名を指定する方法だとチェックが漏れた時に危険なことになります。

投稿2016/04/10 13:11

suzukis

総合スコア1449

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

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

退会済みユーザー

退会済みユーザー

2016/04/10 14:26

回答ありがとうございます。 ≫表示の時にフィルタする方が簡単 これはJOINしたあとに、select文が変わってしまっている場合でも抽出するselect文になるということなのでしょうか。 チェックボックスのランダムな選び方は121通りあるのでそのたびにselect文を書いていくのは大変でしたので…。もしかしたら当然すべき処理を考えに入れていないためにこのようなやり方になっているのかもしれなく、何かアドバイス頂けないでしょうか。
suzukis

2016/04/10 14:49

JOINした後に SELECT文が変わってしまっている場合、というのがよくわかりませんが、何が選択されていようが関係なく`SELECT A.*, B.*, C.* FROM A JOIN B ... JOIN C ... WHERE A.ID = ?`でデータを取り出してしまい、表示の時に選択されたカラムだけ表示すればよいのではという話です。抽出されるレコードが多数になる可能性があるとJOINのコストがバカになりませんが、IDで検索するならたかだか1レコードですから気にする事はありません。
退会済みユーザー

退会済みユーザー

2016/04/10 16:00

ありがとうございます。一度抽出してあとから選択されたカラムだけ表示ということなのですね。これは一度モデルであるbeanに一度入れてしまうということなのでしょうか。度々申し訳ないです。チェックボックスが6つのうち何を押されるかわからない状態なので、一度beanに収納してから特定のカラムだけ表示というのは配列にして受け取るようにということなのでしょうか。はじめから数が固定であればそのまま表示すればよいと思うのですがその部分がまだつっかえております。
guest

0

私が同様の機能を作るなら、すべての項目を一旦呼び出しておいて、表示するところで絞込をします。

なぜ、無駄な読み込みまでするかというと、戻ってきた値を編集するだけで済むからです(IDで呼び出して、編集して表示する)。

hukutomiさんが考えている方法では、呼び出しとSQLと結果と編集それぞれで項目に関しての考慮が必要になり開発負荷がかかります。

もちろん呼び出しのデータ量が多くサーバーやネットワークに負荷が問題になる場合は避けるべきですが、インデックスが効いている問い合わせで、呼び出しが1レコードの場合は負荷を考える必要ばほぼないと考えて良いです。(そのような呼び出し方になるように工夫すればなお良い。)


あれ、suzukisさんが先に同じ内容で回答していましたね。
私のはいらない投稿です。すみません。

投稿2016/04/10 15:27

編集2016/04/10 16:02
iwamoto_takaaki

総合スコア2883

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

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

退会済みユーザー

退会済みユーザー

2016/04/10 16:30

回答ありがとうございます。いえいえ感謝しております。
guest

0

from句で、
必要なテーブルを全てjoinしておけばいいように思うのですが、それではだめな理由があったりしますか?

投稿2016/04/10 12:11

Odacchi

総合スコア907

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

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

退会済みユーザー

退会済みユーザー

2016/04/10 14:14

回答ありがとうございます。JOINしたあとに、複数のフィールドが任意に選ばれてる場合、例えば身長と体重だけのとき、このときはselect文は 身長と体重を指定すると思います。でもチェックボックスで体重と住所のみを選んでいた場合はselect文が変わってしまうので、逐一選び方(121通り)があるのでそのたびにselect文を書いていくのは大変でしたので…。もしかしたら当然すべき処理を考えに入れていないためにこのようなやり方になっているのかもしれなく、何かアドバイス頂けないでしょうか。
Odacchi

2016/04/10 15:31

いえ、SELECT文自体は全部取るようにして、 表示する側で表示したいカラムを選択して表示すれば十分という意見です。 よほど、SQLのチューニングが必要なほど重い処理であれば、別途戦略を考えますが。
退会済みユーザー

退会済みユーザー

2016/04/10 16:33

一度にselectしてしまってからということですね。ありがとうございます。そこから任意のものだけを表示する方法なのですが…selectした全データ(不要なカラムも入っている)をbeanなどに詰めてから必要なものだけ取り出すということが必要なのでしょうか。どう選択してよいか悩んでおります。
suzukis

2016/04/10 23:35

これだけだと何がわからないのかわかりません。表示の方法については具体的なコードを付けて別の質問にされてはいかがでしょう。
退会済みユーザー

退会済みユーザー

2016/04/11 20:29

そうですね。こちらの質問については解決しました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問