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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

1回答

894閲覧

JavaでSQL文を条件に合わせて結合したい

skychord

総合スコア1

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

1グッド

1クリップ

投稿2023/04/01 03:11

実現したいこと

ここに実現したいことを箇条書きで書いてください。
4つの変数(loginId, userName, startBirthDate, endBirthDate)にのいずれかに値が入っていた場合にそれぞれに対応したif文内の処理を実行して変数sqlに結合する。

前提

eclipseで検索画面に入力された値に従ってSQL文を結合していくという処理のコードを書いています。本来であればtoStringメソッドを使用するべきだと思うのですが、今回はif文で必要なSQL文を結合していくやり方でやりたいと思っています。

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

public static List<User> search(String loginId, String userName, String startBirthDate, String endBirthDate) { Connection conn = null; List<User> userList = new ArrayList<User>(); try { conn = DBManager.getConnection(); String sql = "SELECT * FROM user WHERE is_admin = false"; if ("".equals(loginId)) { sql += " AND login_id = ?"; } if ("".equals(userName)) { sql += " AND name LIKE ?"; } if ("".equals(startBirthDate)) { sql += " AND ? <= birth_date"; } if ("".equals(endBirthDate)) { sql += " AND birth_date <= ?"; }    (以降割愛)

試したこと

プログラミングスクールのメンターには上のコードにあるように条件式の書き方を「"".equals(loginId)」のように書くように指示されたのですが、この場合、変数が空文字の時の処理を記述することになり、目的の
である「変数に値が入った場合の処理」がif文の中に記述できなくなってしまうのではないかと思っております。

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

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

logres_Fan👍を押しています

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

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

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

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

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

jimbe

2023/04/01 06:04 編集

メンターが居るなら直接聞いたほうが早いと思いますけど。(その人に本当にそれしか言われなかったんでしょうか。) >本来であればtoStringメソッドを使用するべき どこでどう使用するというのでしょう。 「変数が空文字の時」と「変数に値が入った場合」の違いは理解されているのでしょうか。 そして、 if の条件は真偽値(boolean)であり equals がそれを返すメソッドであること、真偽値は比較/操作できることは理解されていますでしょうか。
javahack

2023/04/01 09:33

メンターの思惑を勝手に推測すると「"".equals(loginId)」を使い、それを応用して答えを導き出すことを期待しているのではないかと。 ヒントは jimbe さんが出してるので自分の頭で考えてみては。
skychord

2023/04/02 02:45

ご返答いただきありがとうございます。 スクールに通っているのでメンターはいるのですが、対応は平日のみで、休日も勉強を進めていきたいと思い質問させていただきました。 変数が空文字の時と値が入った場合の違いや真偽値の比較/操作のことについて改めて調べてみたのですがどのように今回の課題に生かしていくべきか分からなかったので後日メンターに再度相談したいと思います。 ご対応いただきありがとうございました。
dodox86

2023/04/02 04:42

より直接的にヒントを書くと、if文には対応するelse節があるし、真偽値を否定(評価した値を反転、とでも言いましょうか)する ! 演算子がありますね。
guest

回答1

0

ベストアンサー

if ("".equals(loginId)) { ~ } という if の部分は二つの仕様によって処理が行われています。

1つは、 if(式){} は「"式" がtrue なら後続の({} 内の)処理を行う」ということ、もう1つは String.equals() メソッドが関数的に boolean 型を返すということです。
"".equals(loginId)「loginId が空文字なら true」 と訳すなら、この if 文は「"loginId が空文字なら true" が true なら後続の({} 内の)処理を行う」ということになります。

一方、boolean は int 等と同じように == 等によって値の比較が出来、例えば true==true という式は true で false==false も true、 true==false は false 等となります。

これらを踏まえて、 if 文を「loginId が空文字で無いなら処理を行う」に変えてみましょう。
"loginId が空文字で無い" ということは 「"loginId が空文字なら true" が false」 ということが出来ます。これをコード化すると "".equals(loginId)==false となり、 if 文にすると if ("".equals(loginId)==false) { ~ } となります。

また、 boolean は "!" という単項演算子によって値を反転することが出来ます。 !true は false で !false は true です。

"".equals(loginId)==false!"".equals(loginId)と書くことも出来、 if 文としてif (!"".equals(loginId)) { ~ }とも書けるということです。

投稿2023/04/02 04:59

編集2023/04/02 05:05
jimbe

総合スコア12646

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

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

skychord

2023/04/02 06:23

ご回答いただきありがとうございます。 「"".equals(loginId)==false」や「!"".equals(loginId」といった書き方ができるというのはすごく参考になりました。ただ、メンターに空文字ではなく"null"の値が入っていた場合も考えるようにとも言われたことが引っかかっており、その結果「"".equals(loginId)」のように書き方を変えるように指摘されました。 そのため、今回教えていただいた2つの書き方でも何らかの形でloginIdに"null"の値が入っていた場合に思うような処理ができないのではないかと考えています。この点、どのように解消したらよろしいでしょうか?
jimbe

2023/04/02 06:48 編集

"".equals(loginId) で loginId が null だった場合は false になります。 この書き方が loginId.equals("") より良い点は、 loginId が null だった場合に loginId.equals("") では例外( NullPointerException)が発生するのに対し、 "".equals(loginId) は例外は発生しない点です。 しかし loginId が "" でも null でも無い場合に処理をしたいのであれば "".equals(loginId) == false では null が通ってしまう為にそれだけでは使えません。 質問へのコメントとして『変数が空文字の時」と「変数に値が入った場合」の違い』と書きましたのは null を考慮するべきかが質問には書いてなかったので遠回しな言い方となりました。 言ってしまうなら、メンターの言われた事は必要なことの一部でしかありません。 「loginId が null で無く、かつ、 "" でも無い」なら処理を行えば良いのですから、 if(loginId != null && !loginId.equals("")) { ~ } としてしまえば良いだけです。 && は左が成立しないと右は実行(評価)されませんので、この順で書けば loginId が null でも例外は発生しません。(!loginId.equals("") はメンター推薦(?)の !"".equals(loginId) でも良いですし !loginId.isEmpty() とか !(loginId.length()==0) とか、いっそ "!" を付けないで loginId.length()>0 とか色々あります。) もし if() の式を && で並べたりしない方法で書けという縛りがあるのであれば、 static boolean isValid(String s) { return s!=null && !s.equals(""); } と言ったメソッドを作って if(isValid(loginId)) { ~ } とする感じと思います。
skychord

2023/04/02 12:03

詳しく丁寧にご回答いただきありがとうございます。 "".equals(loginId)とloginId.equals("")の違いも分かっていなかったのでそこから整理していただいたことでようやく理解できました。 また、書き方のバリエーションまで考えてくださりありがとうございます。 お陰様で休日にもう少し勉強を進められそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問